問題
如果在線程A中發(fā)送通知撞牢,接收到通知后調(diào)用的方法是否是運行在線程A中?
舉例
// 線程A中發(fā)送通知
NotificationCenter.default.post(name: NotifyConnectStateChanged, object: nil, userInfo: ["state":connectState])
// 在主線程中添加observer
NotificationCenter.default.addObserver(self, selector: #selector(connectedStateChanged(noti:)), name: NotifyConnectStateChanged, object: nil)
驗證
- 在線程A中post通知
DispatchQueue.global().async {
NotificationCenter.default.post(name: notifyNa, object: nil)
}
- 在ViewDidLoad中注冊觀察者
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.notify(noti:)), name: notifyNa, object: nil)
}
此時是在主線程中注冊了觀察者
-
發(fā)送廣播,觀察是在注冊觀察者的主線程還是在發(fā)送廣播的其他線程中調(diào)用selector
從圖中可以看出,廣播的發(fā)送和接收都在同一個線程中。
結(jié)果
Notification是在同一個線程完成post和observer的處理