NSNotificationCenter - 通知中心
2020-07-10 本文已影响0人
js_huh
是什么?
- 可以理解为,它就是一个系统创建的平台。
-
'通知发布者' 和 '通知接收者'之间沟通的桥梁。
什么特点?
- 每一个应用程序,都有一个通知中心。
- 它是系统定义得,不需要手动创建。
- 任何一个对象,都可以向通知中心,发布通知 (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个对象发生了什么事。 - 通知比较简单,但是容易出错。
如, "通知名"拼写错误,在编译时不会有任何提示,运行时才会报错。 - 代理比较规范,但有些麻烦。
- 代理和通知都能完成,对象和对象之间的通信!
但是能用"代理"就不用"通知"
也可以看看
来自于哪里?
- iOS-MJ-UI基础-大神班/day-11/05-模拟通知