在主线程上发布NSNotification

时间:2013-04-04 14:15:05

标签: ios objective-c cocoa nsnotificationcenter

我找到了以下代码片段,它允许NSNotification从任何后台线程发布到主线程上。我想知道这是否是一种安全可行的做法?

dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved" 
                                                        object:nil 
                                                      userInfo:imageDict];
});

4 个答案:

答案 0 :(得分:49)

是的,你可以

通常,您希望在主服务器上发送NSNotifications,特别是如果它们触发UI活动,例如解除模态登录对话框。

Delivering Notifications To Particular Threads

  

常规通知中心在线程中发送通知   通知已发布。分布式通知中心   在主线程上发送通知。有时,您可能需要   要在特定线程上传递的通知   由您而不是通知中心确定。例如,如果   在后台线程中运行的对象正在侦听   来自用户界面的通知,例如窗口关闭,您   想在后台线程中收到通知   而不是主线程。在这些情况下,你必须抓住   通知,因为它们是在默认线程和重定向上传递的   他们到适当的线程。

答案 1 :(得分:16)

这是 - 您进入主线程并发布通知。不能比那更安全。

答案 2 :(得分:14)

Swift 2 语法

dispatch_async(dispatch_get_main_queue()) {
    NSNotificationCenter.defaultCenter().postNotificationName("updateSpinner", object: nil, userInfo: ["percent":15])
}

Swift 3 语法

DispatchQueue.main.async {
    NotificationCenter.default.post(name: "updateSpinner", object: nil, userInfo: ["percent":15])
}

答案 3 :(得分:5)

在某个地方,这可以通过以下方式实现:

addObserver(forName:object:queue:using:)

here,但整点是queue对象。

  

应添加块的操作队列。如果你通过nil,   该块在发布线程上同步运行。

那么如何获得与主runloop对应的队列?

let mainQueue = OperationQueue.main

注意:这是在您订阅通知时,所以您只需执行一次即可完成通知。每次通话都是非常多余的。