你要知道的KVC、KVO、Delegate、Notification都在这里
转载请注明出处 http://blog.csdn.net/u014205968/article/details/78224833
本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。
- KVC 使用方法详解及底层实现
- KVO 正确使用姿势进阶及底层实现
- Protocol与Delegate 使用方法详解
- NSNotificationCenter 通知使用方法详解
- KVO、Delegate、Notification 区别及相关使用场景
NSNotificationCenter 通知的使用方法详解
NSNotificationCenter
通知中心是iOS程序内部的一种消息广播的实现机制,可以在不同对象之间发送通知进而实现通信,通知中心采用的是一对多的方式,一个对象发送的通知可以被多个对象接收,这一点与我们前面讲解的KVO
机制类似,KVO
触发的回调函数也可以被对个对象响应,但代理模式delegate
则是一种一对一的模式,委托对象只能有一个,对象也只能和委托对象通过代理的方式通信。
首先看一下比较重要的NSNotification
类,这是通知中心的基础,通知中心发送的的通知都会封装成该类的对象进而在不同对象之间传递。其比较重要的属性和方法如下:
//通知的名称,有时可能会使用一个方法来处理多个通知,可以根据名称区分
@property (readonly, copy) NSNotificationName name;
//通知的对象,常使用nil,如果设置了值注册的通知监听器的object需要与通知的object匹配,否则接收不到通知
@property (nullable, readonly, retain) id object;
//字典类型的用户信息,用户可将需要传递的数据放入该字典中
@property (nullable, readonly, copy) NSDictionary *userInfo;
//下面三个是NSNotification的构造函数,一般不需要手动构造
- (instancetype)initWithName:(NSNotificationName)name object:(nullable id)object userInfo:(nullable NSDictionary *)userInfo API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0)) NS_DESIGNATED_INITIALIZER;
+ (instancetype)notificationWithName:(NSNotificationName)aName object:(nullable id)anObject;
+ (instancetype)notificationWithName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
NSNotification
通知类本身很简单,需要着重理解的就是其三个属性,接下来看一下NSNotificationCenter
通知中心,通知中心采用单例的模式,整个系统只有一个通知中心,通过如下代码获取:
[NSNotificationCenter defaultCenter]
再看一下通知中心的几个核心方法:
/*
注册通知监听器,只有这一个方法
observer为监听器
aSelector为接到收通知后的处理函数
aName为监听的通知的名称
object为接收通知的对象,需要与postNotification的object匹配,否则接收不到通知
*/
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
/*
发送通知,需要手动构造一个NSNotification对象
*/
- (void)postNotification:(NSNotification *)notification;
/*
发送通知
aName为注册的通知名称
anObject为接受通知的对象,通知不传参时可使用该方法
*/
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
/*
发送通知
aName为注册的通知名称
anObject为接受通知的对象
aUserInfo为字典类型的数据,可以传递相关数据
*/
- (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;