NSNotificationCenter事件是同步还是异步接收的?

42
如果一个类注册了某种类型的NSNotificationCenter事件,并且另一个类发布了该类型的事件,那么接收器中的代码会在发布类继续之前(同步)还是之后(异步)执行?
如果一个类注册了某种类型的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 from receiver"会在"Hello from caller"之后打印吗?


只需查看https://dev59.com/u3I-5IYBdhLWcg3wW24L。 - Lochana Ragupathy
请阅读以下答案的原始帖子:https://dev59.com/o2sz5IYBdhLWcg3weHkA - BhushanVU
1个回答

98
根据 NSNotificationCenter 的文档NSNotificationCenter Class Reference所述,通知是同步发布的。
通知中心会同步地向观察者发送通知。换句话说,postNotification: 方法在所有观察者都接收并处理通知之前不会返回。要异步发送通知,请使用 NSNotificationQueue。
在多线程应用程序中,通知始终在发布通知的线程中传递,这可能与注册观察者的线程不同。
希望对你有所帮助。

3
好的,请提供需要翻译的内容。 - Nipun Arora
我不理解“同步”这个术语,或者你的回答完全是错误的。我想按照以下顺序调用:1)通知;2)通知处理程序;3)通知中同一块中的代码。但实际上它被调用为1、3、2 - 错误的顺序。 - Gargo
@Gargo 如果你不理解答案,那并不意味着答案是错误的。这是正确且被接受的答案。 - Nishant Tyagi
1
我写了一份解释,它的意思是你的短语“postNotification:方法在所有观察者接收和处理通知之前不会返回”是不正确的。我的问题有什么问题吗? - Gargo
很好的答案。苹果自己的“通知编程主题”也明确回答了这个问题:使用NSNotificationCenter的postNotification:方法及其变体,您可以将通知发布到通知中心。但是,该方法的调用是同步的:在发布对象可以恢复其执行线程之前,它必须等待通知中心将通知分派给所有观察者并返回。https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Notifications/Articles/NotificationQueues.html - paperlib
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接