在主线程上发布NSNotification

我发现下面的代码片断允许NSNotification从任何后台线程发布到主线程上。 我想知道这是否是一个安全和可接受的做法?

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

是的,你可以

一般来说,你希望NSNotifications被发送到主,特别是如果他们触发UI活动,如解除模态login对话框。

向特定主题发送通知

定期通知中心在发布通知的主题上发送通知。 分布式通知中心在主线程上传递通知。 有时,您可能需要通过由您而不是通知中心确定的特定主题来发送通知。 例如,如果在后台线程中运行的对象正在侦听来自用户界面的通知(如窗口closures),则希望在后台线程而不是主线程中接收通知。 在这些情况下,您必须捕获在默认线程上传递的通知,并将其redirect到适当的线程。

这是 – 你正在进入主线程并发布你的通知。 没有比这更安全的了。

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]) } 

在这条线的某处,这成为可能:

 addObserver(forName:object:queue:using:) 

这是在这里 ,但整点是queue对象。

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

那么如何获得与主循环相对应的队列呢?

let mainQueue = OperationQueue.main

注意:这是您订阅通知的时候,所以您只需要一次,然后就完成了。 每一次打电话都是非常多余的。