iOS开发中的传送消息机制总的来说细分为三大类:
- 本地通知
- 推送通知
- 通知中心
三者之间并没有什么直接性质的联系,通知中心是向应用程序中注册某个观察者的所有对象广播消息,通过通知中心可以很好的协调不同对象之间的消息通信。
注意:
每一个应用程序都有且只有一个通知中心(NSNotificationCenter)实例
代理和通知中心都是协调各个对象之间进行消息通信,通知中心在功能上与代理有些类似,二者在选择时有什么区分?
代理对应的关系的一对一的关系,而通知是一对多的关系,所以在遇到需要一处改变引起多出
变化的功能上我们最好选择通知。
例如 :
- QQ音乐App上换皮肤效果
- 读书软件改变字体大小效果
在实际开发中合理的使用二者,防止大材小用
一个通知成功实施的必有要三要素
- 通知发布者
- 通知中心
- 通知接收者
一个完整通知包含三个属性
- name:通知的名称
- object:通知的发布者
- userInfo:通知者给通知接收者的信息内容
通知接收者向通知中心注册通知方法
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;
observer:监听器,即谁要接收这个通知
aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入
aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知
anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知
通知中心发布通知的三种方法
• - (void)postNotification:(NSNotification *)notification;
• - (void)postNotificationName:(NSString *)aName object: (id)anObject;
• - (void)postNotificationName:(NSString *)aName object:(id)anObject
userInfo:(NSDictionary *)aUserInfo;
通知下的dealloc方法
我们在通知中心注册完后,通知中心是非常灵敏的,当条件被触发后就会不断的向注册者发送消息,但当我们的注册者已经被释放了,这时候就会造成野指针,引发程序崩溃,所以在我们对象被释放的时候,应该把该对象向通知中心注册的通知释放掉。
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
另外取消注册的方法有两个:
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;
//第二个多了一个name的参数可以具体到该对象中某个通知
通知中心的常见的实际应用
1. 设备旋转
UIDeviceOrientationDidChangeNotification
2. 键盘操作
UIKeyboardWillShowNotification // 键盘即将显示
UIKeyboardDidShowNotification // 键盘显示完毕
UIKeyboardWillHideNotification // 键盘即将隐藏
UIKeyboardDidHideNotification // 键盘隐藏完毕
UIKeyboardWillChangeFrameNotification // 键盘的位置尺寸即将发生改变
UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕
提醒
通知的正常执行的顺序为:接收者在通知中心注册通知——>通知者在通知中心发布通知———>释放通知中心的注册通知。顺序出错将会产生错误。
时间: 2024-11-10 08:00:25