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

时间:2012-03-05 04:21:33

标签: objective-c cocoa-touch objective-c-blocks grand-central-dispatch

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

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

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

someMethodStandardMethodUsingABlock:^() {
    [[NSNotificationCenter defaultCenter] postNotificationName:"notif" object:nil];
}];

它在我的测试中起作用。

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

马特

2 个答案:

答案 0 :(得分:9)

NSNotificationCenter类参考中的这两句话提​​出了几个可能的原因:

  

通知中心向观察员发送通知   同步。换句话说,postNotification:方法没有   返回,直到所有观察员都收到并处理了   通知。

...

  

在多线程应用程序中,始终会传递通知   发布通知的线程,可能不是   观察者注册的同一个线程。

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

答案 1 :(得分:0)

有时您需要运行异步触发某些执行的方法并立即返回。例如。某些AppDelegate'关键'方法(如applicationDidBecomeActiveapplicationDidEnterBackground)需要执行并快速返回,以便操作系统不会终止您的应用。

我不知道您的问题是否属于这种情况,但可能会解释dispatch_async的用法。