NSOperation и NSNotificationCenter на основном потоке

У меня есть NSOperation. Когда это закончено, я запускаю NSNotificationCenter, чтобы позволить программе знать, что NSoperation закончен и обновить gui.

Моим понимающим слушателям NSNotification не будет работать на основном потоке, потому что NSOperation не находится на основном потоке.

Как я могу сделать его так, чтобы слушатели работали на основном потоке, когда я запускаю свое событие?

[[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self]; 
19
задан Mel 29 December 2009 в 05:44
поделиться

2 ответа

Можно использовать для выполненияSelectorOnMainThread:withObject:waitUntilDone: с использованием метода-помощника, аналогично следующему примеру.

.....
[self performSelectorOnMainThread:@selector(fireNotification) withObject:nil waitUntilDone:YES];
...

- (void)fireNotification {
  [[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self]; 
}

Если не ждать, то необходимо рассмотреть случаи, когда другие потоки могут ссылаться на объект, который уже может быть очищен перед вызовом основного потока.

.
23
ответ дан 30 November 2019 в 01:58
поделиться

Если вы находитесь на 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!

.
6
ответ дан 30 November 2019 в 01:58
поделиться