在这种情况下,dispatch_async(dispatch_get_main_queue(),...)是否必要?

MGA*_*MGA 5 cocoa-touch objective-c grand-central-dispatch objective-c-blocks

我遇到了这段代码,我无法弄清楚作者为什么会这样做.看看这段代码:

someMethodStandardMethodUsingABlock:^() {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
    });
}];
Run Code Online (Sandbox Code Playgroud)

我有一个带有完成块的方法,在这个块中必须发布通知.我不太明白为什么dispatch_async在这种情况下主队列是必要的.该块已经在主线程上运行,即使它不是我认为它真的不重要吗?我只想写下这个:

someMethodStandardMethodUsingABlock:^() {
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
}];
Run Code Online (Sandbox Code Playgroud)

它确实在我的测试中起作用.

如果你能帮助我阐明一下,我真的很感激!

马特

Dav*_*har 9

NSNotificationCenter类参考中的这两句话表明了几个可能的原因:

通知中心同步向观察者发送通知.换句话说,postNotification:方法在所有观察者都收到并处理通知之前不会返回.

...

在多线程应用程序中,通知始终在发布通知的线程中传递,这可能与观察者注册自己的线程不同.

因此,或许(a)作者不希望代码在所有观察者处理通知之前阻塞,和/或(b)他想确保观察者方法在主线程上运行.