博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式摘要
阅读量:7236 次
发布时间:2019-06-29

本文共 2116 字,大约阅读时间需要 7 分钟。

hot3.png

    观察者模式允许一个对象在它的状态发生变化时通知多个观察者,而被观察的对象无需对观察者有特定的认识。观察者模式在cocoa中以多种形式出现,包括NSNotification、委托观察遗迹键-值观察(kvo)。他促使对象之间产生弱藕合,以使组建更具可重用性并且更加健壮。

    大多数cocoa开发者都遇到过NSNotificationCenter ,它允许通过一个对象注册被通知的事件来提供松散耦合,该事件被字符串名称定义,通知比kvo更容易理解和实现,下面是关于如何使用它的多示例。

//Poster.h//为通知定义一个字符串常量//注意这样是声明一个指向不可变字符串的常量指针extern NSString *const PosterDidSomethingNotificaton;

//Poster.mNSString *const PosterDidSomethingNotificaton=@"PosterDidSomethingNotificaton";/**...*///其中的发送者作为通知的对象[[NSNotificationCenter defaultCenter] postNotificationName:PosterDidSomethingNotificaton object:nil];

Observe.m//导入Poster.h以获取字符串常量#import "Poster.h"//...//注册以接收通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(PosterDidSomething:) name: PosterDidSomethingNotificaton object:nil];...-(void)PosterDidSomething{    //在这里处理通知}-(void)dealloc{    //总是在这里移除你的观察者    [[NSNotificationCenter defaultCenter] removeObserver:self];    [super dealloc];}

观察者应该考虑是否要观察一个特定的对象活着nil(所有具有给定名称的通知,与object的值无关。)

多次使用相同参数调用addObserver:selector:name:object: 方法会导致收到多个回调,但这些回调几乎不是你想要的,一般来说最简答方法是在init理开始观察通知并在dealloc里停止,但如果你想要查看来自某个属性的通知,而这个属性可变呢?下面的示例演示如何编写setPoster:方法方便正确的为poster属性添加或者益处观察者:

-(void)setPoster:(Poster *) aPoster{    NSNotificationCenter *nc=[NSNotificationCenter defaultCenter];    if(_poster!=nil){        //针对旧值益处所有观察者        [nc removeOberver:self name:nil object:_poster];      }    _poster=aPoster;    if(_poster!=nil){            [nc addObserver:self         selecter:@selecter(anEventDidHappen:)         name:PosterDidSomethingNotification         object:_poster];    }}//这里设置nil非常重要,把nil作为object或者name传递的意思是“任何对象/通知”。

要是你想观察来自大量对象的某个通知但不一定每个对象都会发生通知又改怎么办呢?比如你可能喜欢随意切换歌曲,但仅限于当前播放列表里的歌曲。你可以一首首的听,但这样非常繁琐,下面展示一种观察nil并且检查你真正想要毁掉的好方法。

//观察所有对象,无论是否在你的曲目列表中[[NSNotificationCenter defaultCenter] addOberver:self selector:@selector(trackaDidChange:) name:TrackDidChangeNotification object:nil];//...-(void)trackaDidChange{//确认这首歌曲不是你想听的if([self.tracks containsObject: [note object]]){    /*    *...    */    }}

这种方法降低了观察的数量,但在回调过程中添加了一个额外的检查。

发生通知时同步的,这可能会让那些希望在另一个线程上执行通知货其他方式异步运行通知的开发者感到不便,

转载于:https://my.oschina.net/u/1778933/blog/513878

你可能感兴趣的文章
AT&T向执法机构出售用户通信记录
查看>>
台风来了 如何防止光伏电站“飞”上天?
查看>>
安徽省抽检安防监控摄像机产品质量合格率75%
查看>>
刘剑锋:聚焦运营和智能,用友云构建全新商业智慧
查看>>
《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理》——2.3 设置虚拟盘空间并初始化...
查看>>
DDoS攻击在2016年将会呈现抬头的趋势
查看>>
增强型蓝牙 5 会让 BLE 成为物联网的最佳选择吗?
查看>>
《算法导论(原书第3版)》一3.2 标准记号与常用函数
查看>>
RFID技术助力解决“看病难”难题
查看>>
Windows 10处于下风?大量企业员工开始使用苹果OS X
查看>>
Change DNS Helper - 轻松帮你更换20种以上DNS服务器
查看>>
混合云使用不能盲目:学习最佳实践是王道
查看>>
程序员测试微信小程序后,发现这群人才能赚到钱
查看>>
Facebook的算法缺陷与扎克伯格的媒体窘迫
查看>>
Cat.0实现更低功耗、更低成本物联网设备连接到LTE网络
查看>>
在外面吃饭,你会用开水烫餐具吗?事实太吓人了!
查看>>
DBImport V3.1 数据互导工具及文档生成器更新发布
查看>>
欧盟与美国的个人数据传输保护协议尘埃落定
查看>>
成都大数据三大平台正式上线
查看>>
华为与GE建立战略合作伙伴关系,加速工业物联网联合创新
查看>>