我找到了以下代码片段,它允许NSNotification
从任何后台线程发布到主线程上。我想知道这是否是一种安全可行的做法?
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ImageRetrieved"
object:nil
userInfo:imageDict];
});
答案 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
注意:这是在您订阅通知时,所以您只需执行一次即可完成通知。每次通话都是非常多余的。