У меня есть NSOperation. Когда это закончено, я запускаю NSNotificationCenter, чтобы позволить программе знать, что NSoperation закончен и обновить gui.
Моим понимающим слушателям NSNotification не будет работать на основном потоке, потому что NSOperation не находится на основном потоке.
Как я могу сделать его так, чтобы слушатели работали на основном потоке, когда я запускаю свое событие?
[[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self];
Можно использовать для выполненияSelectorOnMainThread:withObject:waitUntilDone:
с использованием метода-помощника, аналогично следующему примеру.
.....
[self performSelectorOnMainThread:@selector(fireNotification) withObject:nil waitUntilDone:YES];
...
- (void)fireNotification {
[[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self];
}
Если не ждать, то необходимо рассмотреть случаи, когда другие потоки могут ссылаться на объект, который уже может быть очищен перед вызовом основного потока.
.Если вы находитесь на 10.6, вы также можете использовать setCompletionBlock:. Он используется следующим образом:
NSOperation*op= .... ;
[op setCompletionBlock:^{
dispatch_async(dispatch_get_main_queue(),^{
code to be run on the main thread after the operation is finished.
});
}];
Для общего введения в блоках и GCD, эта статья была чрезвычайно полезна. Я нашел GCD & setCompletionBlock более легким для чтения, чем NSNotification. Одним из предостережений является то, что он работает только на 10.6!
.