1、为什么要使用通知
使用 Notifications
用户可能使用一个软件并打开了几个document, 然后他发现紫色的背景颜色实在是不利于阅读文档正文. 于是,他打开Preferences修改背景颜色,不过令人失望的是,已经存在的文档的背景颜色不会跟着改变. 于是,这个用户可能会写信给你告诉你这些.
你也许会回复:”defualts会在document创建的时候才读取,保存document在打开”实际上。
(用户的想要使用一个功能,操作太多,加大了app的使用难度,毕竟不是每一个用户都是使用app的高手,这样的用户的体验是不好的)
2、 什么是Notification?
这个要求其实也很容易实现.
每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏.
对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我). 我们把这些注册对象叫做 observer(观察者). 其它的一些对象会给center发送notifications(我捡到了一只小狗). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster(海报–消息的发布者).
很多的标准Cocoa类会发送notifications: 在改变size的时候,Window会发送notification; 选择table view中的一行时,table view会发送notification;我们可以在在线帮助文档中查看到标准cocoa对象发送的notification
关于例子的解释
在我们的例子中,我们将MyDocumet对象注册为observer. 而preference controller在用户改变color时将发送notification. MyDocument在接受到该notification后改变background color
(MyDocumet 作为一个观察者,preference controller 作为一个消息的发布者,用户改变color时,preference controller将color改变的信息传递给通知中心,通知中心再发布通知,MyDocumet 作为观察者就会接受到color改变的信息,这个时候MyDocumet 就会调用方法刷新background color)
注意点:在MyDocument对象释放前,我们必须从notificationcenter移除我们注册的observer. 一般我们在dealloc方法中做这件事(这个是为了避免野指针错误(notificationcenter使用一次就会进行一个计数器加1,但是观察者对象并不知道什么时候不在使用默认是不会做计数器减1 操作,这个就需要我们手动的在dealloc 这个方法中移除notificationcenter 做一个计数器减1 的操作))
3、Notifications 不是什么
当程序员们听到notificationcenter的时候, 他们可能会联想到IPC(进程间通讯).
他们认为:”我在一个程序中创建一个observer,然后在另外一个程序中发送一个notification”.
这个设计没有办法工作的, notificationcenter允许同一个程序中的不同对象通许,它不能跨越不同的程序。
[Notification 就是设计模式中的 观察者模式, cocoa为我们实现了该模式]
4、NSNotification 和 NSNotificationCenter
Notification对象非常简单. 它就是poster要提供给observer的信息包裹.
notification对象有三个重要的成员变量: name , object 和 userInfo。 一般object都是指向poster(为了让observer在接受到notification时可以回调到poster)
@property (readonly, copy) NSString *name;
@property (readonly, retain) id object;
@property (readonly, copy) NSDictionary *userInfo;
NSNotificaitonCernter是架构的大脑了.它允许我们注册observer对象, 发送notification, 撤销 observer 对象注册
//下面是它的一些常用方法
// 获取通知中心
+ (NSNotificationCenter *)defaultCenter
// 返回notificationcenter [**类方法,返回全局对象, 单件模式.cocoa的很多的全局对象都是通过类似方法实现**]
// 注册一个通知
- (void)addObserver:(id)anObserver
selector:(SEL)aSelector
name:(NSString *)notificationName
object:(id)anObject
// 关于参数:
anObserver:通知的观察者--->那个对象要监听通知 (任何继承自NSObject的对象都可以作为观察者)
aSelector:观察者监听到通知后要调用的方法
notificationName:观察者监听的通知的名称————>通知是一个字符串
anObject:同时的发送者(poster)对象————>notificationName 这条通知的发送者
这个方法的意思:当anObserver对象监听到anObject对象发送的notificationName通知 就会调用anObserver 的 aSelector这个方法。
注意:
如果notificationName为nil. 那么notificationcenter将anObject发送的所有notification转发给observer
如果anObject为nil.那么notificationcenter将所有名字为notificationName的notification转发给observer
如果notificationName 和 anObject 都为空,那么notificationcenter将所有对象发