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

一、解析

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 观察者模式也叫发布/订阅模式,是软件设计模式中的一种。在这种模式中,一个目标物件管理所有相依于它的观察者物件,并且...
    蜗牛非牛阅读 1,488评论 1 6
  • 通知机制 基本概念 通知中心(NSNotificationCenter) 每一个应用程序都有一个通知中心(NSNo...
    iOS_Cqlee阅读 547评论 1 7
  • KVO与通知都可实现观察者模式。 一、通知简介 NSNotificationCenter是一个消息通知机制,类似广...
    f1e583c455bf阅读 907评论 0 1
  • 【前言介绍】 iOS的一种设计模式,观察者Observer模式(也叫发布/订阅,即Publich/Subscrib...
    啊左阅读 5,987评论 18 49
  • 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息...
    蓝心儿的蓝色之旅阅读 309评论 0 0