其實有一個gottcha;你會隨機崩潰!這是我的經驗。這與接收通知的對象在與通知的發送者相同的線程上這樣做的事實有關。
從Apple iOS Documentation on Notification Centers:
在多線程應用程序,通知在 在通知被張貼線程,這可能不是由觀察者註冊本身 同一個線程總是交付。
這將不可避免地令你頭疼。
如果通知正在被主線程上的某些東西接收到,我發現從後臺線程彈出進入主線程發出通知是最安全的方法。這是做的相當簡單:
//Call this to post a notification and are on a background thread
- (void) postmyNotification{
[self performSelectorOnMainThread:@selector(helperMethod:) withObject:Nil waitUntilDone:NO];
}
//Do not call this directly if you are running on a background thread.
- (void) helperMethod{
[[NSNotificationCenter defaultCenter] postNotificationName:@"SOMENAME" object:self];
}
不幸的是這引入了發送者和接收者之間的微妙耦合在正在修改的發送者,以適應接收器。正如XJones指出的,更好的解決方案是讓發送者發送通知給它所決定的任何線程,然後讓偵聽器負責使用正確的線程執行所需的任何操作。
希望有幫助。
我在回答中的評論中引用了此問題。我不喜歡你的解決方案完全是發佈通知的對象與觀察者之間的耦合的b/c。對象發佈應該發佈在它喜歡的任何線程上。接收者應該在它需要的線程上處理通知(例如,接收者可以將通知轉發給主線程或任何其他線程)。 Apple在其示例代碼中也使用這種方法。 – XJones
我完全同意。我已更新我的答案以反映此方法。 – PixelCloudSt
@PixelCloudSt我明白這種方法中的耦合,但我將如何去讓接收器在多線程上進行偵聽? –