Я после некоторого совета относительно использования NSOperation
и рисование:
У меня есть основной поток, создают мой NSOperation
подкласс, который затем добавляет его к NSOperationQueue
.
Мой NSOperation
делает некоторую тяжелую обработку, она предназначается для цикличного выполнения в ее основном () метода в течение нескольких минут, постоянно обрабатывая некоторую работу, но на данный момент у меня просто есть некоторое время () цикл со сном (1) внутренняя часть, которая установлена распространяться вокруг всего 5 раз (для тестирования).
Основной (исходный) поток, который порождает это NSOperation
ответственно за рисование к представлению и обновлению UI.
Я намеревался иметь использование потока NSOperation уведомление, чтобы сказать основному потоку, что это сделало некоторый объем обработки, в данный момент это уведомление отправляется однажды каждый раз, когда это проходит, в то время как () цикл (который является; однажды секунда, потому что это просто делает сон (1)). Основной поток (представление), регистры для получения этих уведомлений.
Уведомления сразу добираются до основного потока, и кажущийся асинхронно, смотря очень хорошо. Кажется, что оба потока работают как ожидалось..., который является - одновременно. (Я использую NSLog () только для проверки примерно, когда каждый поток отправляет и получает уведомление).
Когда представление получает уведомление, и его метод обработчиков называют, я просто увеличиваю целочисленную переменную и пытаюсь потянуть это к представлению (как строка, конечно). В тестировании, коде в drawRect: тянет это целое число (как строка) на экран очень хорошо.
Однако: вот моя проблема (извините, она взята некоторое время для получения здесь): когда основной поток (представление) получает уведомление от NSOperation, это обновляет это тестовое целое число и вызовы [сам setNeedsDisplay]. Однако представление не перерисовывает себя, пока NSOperation не закончен! Я ожидал, что NSOperation, будучи отдельным потоком, не будет иметь никакой способности заблокировать цикл событий основного потока, но кажется, что это - то, что происходит. Когда концы NSOperation и его основное () возвраты, представление наконец немедленно перерисовывает себя.
Возможно, я не использую NSOperation
правильно. Я использую его в "не - параллельный" режим, но несмотря на имя мое понимание - то, что это все еще производит новый поток и допускает асинхронную обработку.
Любая справка или совет, очень ценивший, если требуется видеть некоторый код, просто сообщенный мне.
Метод в наблюдателе, который выполняется в ответ на ваше уведомление, не выполняется на главной ните.
Итак, в этом методе вы можете заставить еще один метод проработать на главной ните с использованием 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;
}