NotificationCenter---通知放到子线程进行发送?

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

打印结果:

主线程注册。。。。。
 {number = 1, name = main}
子线程发送通知。。。。。
 {number = 3, name = (null)}
接收通知。。。。。
 {number = 3, name = (null)}

3、子线程注册,子线程发送

//子线程注册
DispatchQueue.global().async {
    self.addNotiFunc()
    print("子线程注册。。。。。结果。。。\n \(Thread.current)")
}

//子线程发送
DispatchQueue.global().async {
     print("子线程发送。。。。。\n \(Thread.current)")
     self.sendNotiFunc()
}

打印结果:

子线程注册。。。。。
 {number = 6, name = (null)}
子线程发送通知。。。。。
 {number = 4, name = (null)}
接收通知。。。。。
 {number = 4, name = (null)}

4、子线程注册,主线程发送

//子线程注册
DispatchQueue.global().async {
    self.addNotiFunc()
    print("子线程注册。。。。。结果。。。\n \(Thread.current)")
}

//主线程发送
self.sendNotiFunc()
print("主线程发送。。。。。\n \(Thread.current)")

打印结果:

子线程注册。。。。。
 {number = 5, name = (null)}
主线程发送。。。。。
 {number = 1, name = main}
接收通知。。。。。
 {number = 1, name = main}

5、主线程注册,主线程发送

//主线程注册
addNotiFunc()
print("主线程注册。。。。。\n \(Thread.current)")

//主线程发送
self.sendNotiFunc()
print("主线程发送。。。。。\n \(Thread.current)")

打印结果:

主线程注册。。。。。
 {number = 1, name = main}
主线程发送。。。。。
 {number = 1, name = main}
接收通知。。。。。
 {number = 1, name = main}

6、总结

1、主线程注册,子线程发送, 结果是发送通知和接收通知是在同一个线程的
2、子线程注册,子线程发送, 结果是发送通知和接收通知是在同一个线程的
3、子线程注册,主线程发送, 结果是发送通知和接收通知是在主线程的
结论:不管在哪里注册,发送通知在哪个线程,接收通知也就在哪个线程

7、不管在哪里发送通知,如果刷新UI,可以使用下面的方式

NotificationCenter.default.addObserver(forName: NSNotification.Name.init(""), object: nil, queue: OperationQueue.main) { (note) in
        
}

你可能感兴趣的:(NotificationCenter---通知放到子线程进行发送?)