美文网首页
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