美文网首页
NotificationCenter---通知放到子线程进行发送

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

作者: 龙之天下 | 来源:发表于2021-04-21 18:00 被阅读0次

    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
            
    }

    相关文章

      网友评论

          本文标题:NotificationCenter---通知放到子线程进行发送

          本文链接:https://www.haomeiwen.com/subject/wfqutltx.html