1、案例代码(通知方法)
fileprivate func sendNotiFunc() {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "ViewController_noti"), object: nil)
}
fileprivate func addNotiFunc() {
NotificationCenter.default.addObserver(self, selector: #selector(xx_method), name: NSNotification.Name(rawValue: "ViewController_noti"), object: nil)
}
@objc func xx_method() {
print("接收通知。。。。。\n \(Thread.current)")
}
2、主线程注册,子线程发送
//主线程注册
addNotiFunc()
print("主线程注册。。。。。\n \(Thread.current)")
//子线程发送
DispatchQueue.global().async {
print("子线程发送。。。。。\n \(Thread.current)")
self.sendNotiFunc()
}
打印结果:
主线程注册。。。。。
<NSThread: 0x600003a303c0>{number = 1, name = main}
子线程发送通知。。。。。
<NSThread: 0x600003a368c0>{number = 3, name = (null)}
接收通知。。。。。
<NSThread: 0x600003a368c0>{number = 3, name = (null)}
3、子线程注册,子线程发送
//子线程注册
DispatchQueue.global().async {
self.addNotiFunc()
print("子线程注册。。。。。结果。。。\n \(Thread.current)")
}
//子线程发送
DispatchQueue.global().async {
print("子线程发送。。。。。\n \(Thread.current)")
self.sendNotiFunc()
}
打印结果:
子线程注册。。。。。
<NSThread: 0x600001fe0740>{number = 6, name = (null)}
子线程发送通知。。。。。
<NSThread: 0x600001fadc00>{number = 4, name = (null)}
接收通知。。。。。
<NSThread: 0x600001fadc00>{number = 4, name = (null)}
4、子线程注册,主线程发送
//子线程注册
DispatchQueue.global().async {
self.addNotiFunc()
print("子线程注册。。。。。结果。。。\n \(Thread.current)")
}
//主线程发送
self.sendNotiFunc()
print("主线程发送。。。。。\n \(Thread.current)")
打印结果:
子线程注册。。。。。
<NSThread: 0x600003694480>{number = 5, name = (null)}
主线程发送。。。。。
<NSThread: 0x6000036905c0>{number = 1, name = main}
接收通知。。。。。
<NSThread: 0x6000036905c0>{number = 1, name = main}
5、主线程注册,主线程发送
//主线程注册
addNotiFunc()
print("主线程注册。。。。。\n \(Thread.current)")
//主线程发送
self.sendNotiFunc()
print("主线程发送。。。。。\n \(Thread.current)")
打印结果:
主线程注册。。。。。
<NSThread: 0x6000003889c0>{number = 1, name = main}
主线程发送。。。。。
<NSThread: 0x6000003889c0>{number = 1, name = main}
接收通知。。。。。
<NSThread: 0x6000003889c0>{number = 1, name = main}
6、总结
1、主线程注册,子线程发送, 结果是发送通知和接收通知是在同一个线程的
2、子线程注册,子线程发送, 结果是发送通知和接收通知是在同一个线程的
3、子线程注册,主线程发送, 结果是发送通知和接收通知是在主线程的
结论:不管在哪里注册,发送通知在哪个线程,接收通知也就在哪个线程
7、不管在哪里发送通知,如果刷新UI,可以使用下面的方式
NotificationCenter.default.addObserver(forName: NSNotification.Name.init(""), object: nil, queue: OperationQueue.main) { (note) in
}
网友评论