繁体   English   中英

在这种情况下,dispatch_async(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 '关键'方法(如applicationDidBecomeActiveapplicationDidEnterBackground )需要执行并快速返回,因此操作系统不会终止您的应用程序。

我不知道你的问题是否属于这种情况,但这可能是对dispatch_async使用的一种解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM