美文网首页
iOS设计模式2 - 观察者模式_通知机制

iOS设计模式2 - 观察者模式_通知机制

作者: 朱_源浩 | 来源:发表于2018-07-18 10:31 被阅读44次

    一、解析

    1. NSNotificationCenter

    NSnotificationCenter是一种典型的有调度中心的观察者模式实现方式。以NSNotificationCenter为中心,观察者往Center中注册对某个主题对象的变化感兴趣,主题对象通过NSNotificationCenter进行变化广播。这种模型就是文章开始发布订阅报纸在OC中的一种类似实现。所有的观察和监听行为都向同一个中心注册,所有对象的变化也都通过同一个中心向外广播。

    通知机制.png

    特点:“一对多”

    2. 通知机制

    在通知机制中对某个通知感兴趣的所有对象都可以成为接收者。
    首先,这些对象需要对通知中心(NSNotificationCenter)发出addObserver:selector:name:object:消息进行注册,在投送对象投
    送通知给通知中心时,通知中心就会把通知广播给注册过的接收者。所有的接收者都不知道通知是谁投送的,更不关心它的细节。投送对象与接收者是一对多的关系。接收者如果对通知不再关注,会给通知中心发出
    removeObserver:name:object:消息解除注册,以后不再接收通知。

    通知机制图.png

    二、实现

    1. 观察者所在类

    1)注册观察者:(一般在viewDidLoad方法中实现)

      //name为通知名,作为区分
      [[NSNotificationCenter defaultCenter]  addObserver:self
                                                selector:@selector(handleAction:)
                                                    name:@"test"
                                                  object:nil];
    ]
    
    • observer:监听器,即谁要接收这个通知
    • Selector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入
    • Name:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知
    • Object:通知发布者。如果Object和Name都为nil,监听器都收到所有的通知

    2)接收广播后的处理

    -(void)handleAction:(NSNotification*)notification
    {
      //获取userinfo
      NSDictionary *theData = [notification userInfo];
      
      //[notification object] 可获取post的object对象
    
      //作出反应
      if (theData !=nil) {
        NSString *data =
        [theData objectForKey:@"testKey"];
        NSLog(@"FlipsideViewController App Terminate Date: %@", data);
      }
    }
    

    3)解除注册(一般在dealloc方法中解除=注册)

    -(void)dealloc{
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    

    2. 被观察的对象

    通过postNotificationName:object:userInfo:发送某一类型通知,广播改变。

    //传递的数据
    NSDictionary *dataDict = [NSDictionary dictionaryWithObject:self.testTextField.text forKey:@"testKey"];
    //发出通知(广播)
    [[NSNotificationCenter defaultCenter] postNotificationName:@"test"
                                                        object:self
                                                      userInfo:dataDict];
    

    一个通知对象要包含的内容:

      1. (NSString *)name; // 通知的名称
      1. (id)object; // 发送对象类型数据,如果接收者不需要,可设为nil
      1. (NSDictionary
        *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)

    补充,可以参考:http://www.th7.cn/Program/IOS/201406/212434.shtml

    相关文章

      网友评论

          本文标题:iOS设计模式2 - 观察者模式_通知机制

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