![](/img/trans.png)
[英]weakself inside dispatch_async queue(dispatch_get_main_queue(), ^{})
[英]Is dispatch_async(dispatch_get_main_queue(), …) necessary in this case?
我遇到了这段代码,我无法弄清楚作者为什么会这样做。 看看这段代码:
someMethodStandardMethodUsingABlock:^() {
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
});
}];
我有一个带有完成块的方法,在这个块中必须发布通知。 我不太明白为什么在这种情况下主队列上的dispatch_async
是必要的。 该块已经在主线程上运行,即使不是,我也不认为它会真的重要吗? 我只想写下这个:
someMethodStandardMethodUsingABlock:^() {
[[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
}];
它确实在我的测试中起作用。
如果你能帮助我阐明一下,我真的很感激!
马特
NSNotificationCenter类参考中的这两句话表明了几个可能的原因:
通知中心同步向观察者发送通知。 换句话说,postNotification:方法在所有观察者都收到并处理通知之前不会返回。
...
在多线程应用程序中,通知始终在发布通知的线程中传递,这可能与观察者注册自己的线程不同。
因此,或许(a)作者不希望代码在所有观察者处理通知之前阻塞,和/或(b)他想确保观察者方法在主线程上运行。
有时您需要运行异步触发某些执行的方法并立即返回。 例如,某些AppDelegate
'关键'方法(如applicationDidBecomeActive
或applicationDidEnterBackground
)需要执行并快速返回,因此操作系统不会终止您的应用程序。
我不知道你的问题是否属于这种情况,但这可能是对dispatch_async
使用的一种解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.