我遇到了这段代码,我无法弄清楚作者为什么会这样做。看看这段代码:
someMethodStandardMethodUsingABlock:^() {
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
});
}];
我有一个带有完成块的方法,在这个块中必须发布通知。我不太明白为什么在这种情况下主队列上的dispatch_async
是必要的。该块已经在主线程上运行,即使不是,我也不认为它会真的重要吗?我只想写下这个:
someMethodStandardMethodUsingABlock:^() {
[[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
}];
它在我的测试中起作用。
如果你能帮助我阐明一下,我真的很感激!
马特
答案 0 :(得分:9)
NSNotificationCenter类参考中的这两句话提出了几个可能的原因:
通知中心向观察员发送通知 同步。换句话说,postNotification:方法没有 返回,直到所有观察员都收到并处理了 通知。
...
在多线程应用程序中,始终会传递通知 发布通知的线程,可能不是 观察者注册的同一个线程。
因此,或许(a)作者不希望代码在所有观察者处理通知之前阻止,和/或(b)他想确保观察者方法在主线程上运行。
答案 1 :(得分:0)
有时您需要运行异步触发某些执行的方法并立即返回。例如。某些AppDelegate
'关键'方法(如applicationDidBecomeActive
或applicationDidEnterBackground
)需要执行并快速返回,以便操作系统不会终止您的应用。
我不知道您的问题是否属于这种情况,但可能会解释dispatch_async
的用法。