【问题标题】:Execution sequence when two NSNotifications are posted发布两个 NSNotification 时的执行顺序
【发布时间】:2011-03-02 07:17:37
【问题描述】:

一个关于NSNotification的小问题...如果我在一个方法中发布两个NSNotifications,它们被不同的对象观察到,选择器方法的执行顺序是什么?

例如,如果我有三个控制器 - 海报、接收器 A 和接收器 B。在海报控制器的功能中,我执行以下操作:

[[NSNotificationCenter defaultCenter] postNotificationName:@"ReceiverADoSomething" object:self];
[[NSNotificationCenter defaultCenter] postNotificationName:@"ReceiverBDoSomething" object:self];

在接收者 A 的 viewDidLoad 方法中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(workToDoByA:) name:@"ReceiverADoSomething" object:nil];

在接收者 B 的 viewDidLoad 方法中:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(workToDoByB:) name:@"ReceiverADoSomething" object:nil];

workToDoByA 会先完成,然后再完成 workToDoByB? 还是一起被处决?

另一种情况...如果我让海报 A 发布通知,但同一通知有两个观察者。那么执行顺序是什么?

提前感谢您的帮助。

【问题讨论】:

  • 我不是专家,但我会假设 A 将在 B 之前执行,但您始终可以在控制器中 NSLog 并查看该顺序。另一方面,我很好奇你关于一个通知的多个观察者的另一个问题的答案。我现在有这种情况,只有一个在开火,所以我也想知道......
  • 没关系,我想通了。单个通知可以拥有任意数量的观察者。

标签: objective-c ios xcode nsnotifications nsnotificationcenter


【解决方案1】:

摘自Apple docs

通知中心同步向观察者发送通知。换句话说, postNotification: 方法在所有观察者都收到并处理通知之前不会返回。要异步发送通知,请使用 NSNotificationQueue。在多线程应用程序中,通知总是在发布通知的线程中传递,这可能与观察者注册自己的线程不同。

同样的政策也适用于 postNotificationName。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多