美文网首页
NSNotificationCenter - 通知中心

NSNotificationCenter - 通知中心

作者: js_huh | 来源:发表于2020-07-10 17:48 被阅读0次

是什么?

  • 可以理解为,它就是一个系统创建的平台。
  • '通知发布者' 和 '通知接收者'之间沟通的桥梁。


什么特点?

  • 每一个应用程序,都有一个通知中心
  • 它是系统定义得,不需要手动创建。
  • 任何一个对象,都可以向通知中心,发布通知 (NSNotification)
    其他感兴趣的对象 (Observer), 可以申请在某个通知发布时 / 某个特定对象发布通知时 ,收到这个通知

有什么用?

  • 负责协调多个对象之间消息的通信。
  • 发布通知, 注册监听器,销毁监听器。

怎么使用?

  • 通知中心(NSNotificationCenter) 是系统创建得,不需要自己手动创建,那么怎么获取系统的NSNotificationCenter呢?
    • [NSNotificationCenter defaultCenter] 系统的通知中心
    • 发送到应用程序的所有系统通知都会发布到通知中心。您也可以在此处发布自己的通知。

注册监听器

  • - addObserver: selector: name: object:
    observer 监听器,( 谁要接收这个通知)
    aSelector 收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入。
    aName 通知名称。如为nil,那么无论通知名称叫什么,监听者都能收到
    anObject 通知的发布者。如果anObject为nil且aName为nil,那么监听者能收到所有通知。
    - (void)addObserver:(id)observer 
             selector:(SEL)aSelector 
                 name:(NSNotificationName)aName 
               object:(id)anObject;
    
  • - addObserverForName: object: queue: usingBlock:
    name 通知名称
    obj 通知发布者
    queue 决定block在哪个操作队列执行,如果为nil,默认在当前操作队列中同步执行。
    block 收到通知时执行的块。
    - (id<NSObject>)addObserverForName:(NSNotificationName)name 
                                object:(id)obj 
                                 queue:(NSOperationQueue *)queue 
                            usingBlock:(void (^)(NSNotification *note))block;
    
    • 示例代码
      没有'监听者',系统就是监听者。
      代码含义: 无论谁发布了通知名称为'jdNoteName'的通知,就会调用'block'里面的方法。
      [[NSNotificationCenter defaultCenter]addObserverForName:jdNoteName object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
          NSLog(@"%@发送的%@,消息内容是:%@",[note.object name],note.name,note.userInfo);
      }];
      [[NSNotificationCenter defaultCenter] postNotificationName:jdNoteName object:compAL userInfo:@{@"title":@"medical is a  problem"}];
      [[NSNotificationCenter defaultCenter] postNotificationName:jdNoteName object:compJD userInfo:@{@"title":@"JD come on"}];
      
      输出结果:
      阿里巴巴发送的717消费券-通知,消息内容是:{
          title = "medical is a  problem";
      }
      京东发送的717消费券-通知,消息内容是:{
          title = "JD come on";
      }
      

发布通知

  • 参数含义:
    aName 通知名称
    anObject 通知的发布者
    userInfo 额外信息(通知发布者传递给通知接收者[监听者]的信息内容)
    notification 要发布的通知

  • - postNotification:
    将给定的通知发布到通知中心

    - (void)postNotification:(NSNotification *)notification
    
  • - postNotificationName: object:
    创建具有给定名称和发件人的通知,并将其发布到通知中心

    - (void)postNotificationName:(NSNotificationName)aName 
                          object:(id)anObject
    
  • - postNotificationName: object: userInfo:
    创建具有给定名称,发件人和信息的通知,并将其发布到通知中心

    - (void)postNotificationName:(NSNotificationName)aName 
                          object:(id)anObject 
                        userInfo:(NSDictionary *)aUserInfo
    
  • 示例代码

     //注册监听器(监听者:p1,监听所有对象发布的所有通知,监听到通知后,调用getMessage:方法)
     [[NSNotificationCenter defaultCenter] addObserver:p1 selector:@selector(getMessage:) name:nil object:nil];
     //创建 "通知",且将通知发送到 "通知中心"
     [[NSNotificationCenter defaultCenter] postNotificationName:alNoteTemp object:compAL];
     [[NSNotificationCenter defaultCenter] postNotificationName:alNoteTest object:compAL userInfo:@{@"你瞅啥":@"瞅你咋地"}];
    

销毁监听器
'通知中心'注册过的对象(监听者 / 监听器),必须在该对象释放前,取消注册

  • 为什么要销毁监听器?
    如果,在'监听者'释放前,不在"通知中心"取消注册,
    那么,当相应的'通知'再次发出时,'通知中心'会再次给'监听者 / 监听器'发送消息,
    但是,'监听者' 已经释放了,所以会产生野指针,导致系统崩溃!
    注: 现在版本已经升级,系统会自动销毁'通知中心注册的没用的监听者'
  • 怎么销毁?
    • removeObserver: name: object:
      从通知中心的调度表中删除匹配的条目
      observer 观察者/监听者
      aName 通知名称
      anObject 通知发布者
      - (void)removeObserver:(id)observer 
                      name:(NSNotificationName)aName 
                    object:(id)anObject
      
        // "p1"不在监听"comp1"发布的"军事新闻"! 
       [[NSNotificationCenter defaultCenter] removeObserver: p1 name:@"军事新闻" object: comp1 ] ;
      
    • - removeObserver:
      从通知中心的分发表中删除所有指定观察者的条目
      - (void)removeObserver:(id)observer
      // p1 不在监听任何通知
      [[NSNotificationCenter defaultCenter] removeObserver: p1 ];
  • 什么时候销毁?
    对象销毁前,会调用dealloc方法

  • 通知和代理的选择
    • 代理: 1个对象只能告诉,另外1个对象发生了什么事。
    • 通知: 1个对象能告诉N个对象发生了什么事。
          1个对象能知道N个对象发生了什么事。
    • 通知比较简单,但是容易出错。
      如, "通知名"拼写错误,在编译时不会有任何提示,运行时才会报错。
    • 代理比较规范,但有些麻烦。
    • 代理和通知都能完成,对象和对象之间的通信!
      但是能用"代理"就不用"通知"

也可以看看

NSNotification - 通知
模拟通知


来自于哪里?

  • iOS-MJ-UI基础-大神班/day-11/05-模拟通知

相关文章

网友评论

      本文标题:NSNotificationCenter - 通知中心

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