2013-04-30 53 views
30

如果一個類註冊了某個類型的事件並且另一個類發佈了該類型的事件,那麼接收者中的代碼會在發佈類繼續之前(同步)還是之後(異步)執行?是否同步或異步接收NSNotificationCenter事件?

- (void)poster { 
    [[NSNotificationCenter defaultCenter] 
     postNotificationWithName:@"myevent" 
     object:nil]; 
    NSLog(@"Hello from poster"); 
} 

- (void)receiver { 
    [[NSNotificationCenter defaultCenter] 
     addObserver:self 
     selector:@selector:(mySelector) 
     name:@"myevent" 
     object:nil]; 
} 

- (void) mySelector:(NSNotification *) notification { 
    NSLog(@"Hello from receiver"); 
} 

在上面的代碼示例中,將「來自接收者的Hello」之前或之後打印「來自接收者的Hello」嗎?

+0

只是看看http://stackoverflow.com/questions/1900352/what-is-nsnotification – 2013-04-30 11:30:08

+0

閱讀下面的答案原始帖子..http://stackoverflow.com/questions/7880742/ios-are-方法 - 由委託人和觀察員 - 在主線程上執行 – BhushanVU 2013-04-30 11:33:24

回答

65

正如NSNotificationCenter NSNotificationCenter Class Reference文檔中所述,通知是同步發佈的。

通知中心同步向觀察者發送通知。 換句話說,postNotification:方法在所有觀察者都收到並處理了通知之後纔會返回。要異步發送通知,請使用NSNotificationQueue

在多線程應用程序中,通知總是在發佈通知的線程中傳遞,而這可能與觀察者註冊自己的線程不同。

希望它可以幫助你。

+3

簡短而恰當的答案! – 2014-07-24 07:16:27

+0

我不明白「同步」術語,或者你的回答完全不正確。我想按以下順序打電話:1)通知; 2)通知處理程序; 3)代碼在通知中的同一個塊中。但它被稱爲1,3,2 - 錯誤的訂單 – Gargo 2014-08-27 18:50:29

+0

@Gargo如果你不明白答案,並不意味着答案是不正確的。這是正確和被接受的答案。 – 2014-08-28 03:35:00