Блоки NSOperation рисование UI?

Я после некоторого совета относительно использования NSOperation и рисование:

У меня есть основной поток, создают мой NSOperation подкласс, который затем добавляет его к NSOperationQueue.

Мой NSOperation делает некоторую тяжелую обработку, она предназначается для цикличного выполнения в ее основном () метода в течение нескольких минут, постоянно обрабатывая некоторую работу, но на данный момент у меня просто есть некоторое время () цикл со сном (1) внутренняя часть, которая установлена распространяться вокруг всего 5 раз (для тестирования).

Основной (исходный) поток, который порождает это NSOperation ответственно за рисование к представлению и обновлению UI.

Я намеревался иметь использование потока NSOperation уведомление, чтобы сказать основному потоку, что это сделало некоторый объем обработки, в данный момент это уведомление отправляется однажды каждый раз, когда это проходит, в то время как () цикл (который является; однажды секунда, потому что это просто делает сон (1)). Основной поток (представление), регистры для получения этих уведомлений.

Уведомления сразу добираются до основного потока, и кажущийся асинхронно, смотря очень хорошо. Кажется, что оба потока работают как ожидалось..., который является - одновременно. (Я использую NSLog () только для проверки примерно, когда каждый поток отправляет и получает уведомление).

Когда представление получает уведомление, и его метод обработчиков называют, я просто увеличиваю целочисленную переменную и пытаюсь потянуть это к представлению (как строка, конечно). В тестировании, коде в drawRect: тянет это целое число (как строка) на экран очень хорошо.

Однако: вот моя проблема (извините, она взята некоторое время для получения здесь): когда основной поток (представление) получает уведомление от NSOperation, это обновляет это тестовое целое число и вызовы [сам setNeedsDisplay]. Однако представление не перерисовывает себя, пока NSOperation не закончен! Я ожидал, что NSOperation, будучи отдельным потоком, не будет иметь никакой способности заблокировать цикл событий основного потока, но кажется, что это - то, что происходит. Когда концы NSOperation и его основное () возвраты, представление наконец немедленно перерисовывает себя.

Возможно, я не использую NSOperation правильно. Я использую его в "не - параллельный" режим, но несмотря на имя мое понимание - то, что это все еще производит новый поток и допускает асинхронную обработку.

Любая справка или совет, очень ценивший, если требуется видеть некоторый код, просто сообщенный мне.

12
задан User97693321 1 February 2013 в 14:45
поделиться

1 ответ

Метод в наблюдателе, который выполняется в ответ на ваше уведомление, не выполняется на главной ните.

Итак, в этом методе вы можете заставить еще один метод проработать на главной ните с использованием PerfortSelectororMaintHaintHead: withound: waituntildone: .

Например:

MyOperation.M

- (void)main {
    for (int i = 1; i <= 5; i++) {
        sleep(1);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"GTCNotification" object:[NSNumber numberWithInteger:i]];
    }
}

MyViewController.M

- (void)setupOperation {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationResponse:) name:@"GTCNotification" object:nil];

    NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
    MyOperation *myOp = [[MyOperation alloc] init];

    [opQueue addOperation:myOp];

    [myOp release];
    [opQueue release];
}

- (void)myNotificationResponse:(NSNotification*)note {
    NSNumber *count = [note object];
    [self performSelectorOnMainThread:@selector(updateView:) withObject:count waitUntilDone:YES];
}

- (void)updateView:(NSNumber*)count {
    countLabel.text = count.stringValue;
}
10
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: