一、NSNotificationCenter 相比于Delegate,可以实现更大跨度的通信机制。可以在两个无引用关系的对象之间进行通信。
二、NSNotificationCenter的通信原理使用了观察者模式:
1、NSNotificationCenter注册观察者对某个事件(以字符串命名)感兴趣,及该事件触发时该执行的Selector或Block
2、NSNotificationCenter在某个时机激发事件(以字符串命名)
3、观察者在收到感兴趣的事件时,执行相应的Selector或Block
三、在这个类NSNotificationCenter中,我们可以看到以下方法:
+ (NSNotificationCenter *)defaultCenter;
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;
- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject;
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;
- (id <NSObject>)addObserverForName:(nullable NSString *)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);
我们一个一个来。
1、首先:
+ (NSNotificationCenter *)defaultCenter;
没有错,这个方法用于返回一个NSNotificationCenter对象,例如下面的使用:
[[NSNotificationCenter defaultCenter]postNotificationName:@"NETWORK_STATE_CONNECTED" object:self userInfo:nil];
2、接着:
//增加观察者
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSString *)aName object:(nullable id)anObject;
参数说明:
observer: 添加观察的对象,例如在某个类中调用,则写为self
aSelector: 收到通知时,执行的Selector
aName: 通知的名称,用于区分不同的通知
anObject: 对哪个发送者对象发出的事件作出响应,nil 时表示接受所有发送者的事件。
//移除观察者
- (void)removeObserver:(id)observer name:(nullable NSString *)aName object:(nullable id)anObject;
//注册通知
- (void)postNotification:(NSNotification *)notification;
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject;
- (void)postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;
参数说明:
aName: 通知的名称(即通知的标识)
anObject: 通知的注册对象
aUserInfo:通知传递的对象
3、带block的添加观察者的方法:
- (id <NSObject>)addObserverForName:(nullable NSString *)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);
例如:
self.observer = [[NSNotificationCenter defaultCenter]addObserverForName:@"NOTIFICATION_NAME2" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
NSDictionary *dic = note.userInfo;
NSString *string = [dic objectForKey:@"key"];
NSLog(@"通知已接收,传递的对象2是:%@",string);
}];
移除方式也是有所不同:
if (self.observer) {
[[NSNotificationCenter defaultCenter]removeObserver:self.observer];
self.observer = nil;
}
例子:https://git.oschina.net/vampireLocker/NSNotificationCenterDemo.git
小总结: NSNotificationCenter的使用,无非就是注册通知、添加观察者、观察到通知后做出响应、在适当的时候移除通知。