一、解析
1. NSNotificationCenter
NSnotificationCenter是一种典型的有调度中心的观察者模式实现方式。以NSNotificationCenter为中心,观察者往Center中注册对某个主题对象的变化感兴趣,主题对象通过NSNotificationCenter进行变化广播。这种模型就是文章开始发布订阅报纸在OC中的一种类似实现。所有的观察和监听行为都向同一个中心注册,所有对象的变化也都通过同一个中心向外广播。
通知机制.png特点:“一对多”
2. 通知机制
在通知机制中对某个通知感兴趣的所有对象都可以成为接收者。
首先,这些对象需要对通知中心(NSNotificationCenter)发出addObserver:selector:name:object:消息进行注册,在投送对象投
送通知给通知中心时,通知中心就会把通知广播给注册过的接收者。所有的接收者都不知道通知是谁投送的,更不关心它的细节。投送对象与接收者是一对多的关系。接收者如果对通知不再关注,会给通知中心发出
removeObserver:name:object:消息解除注册,以后不再接收通知。
二、实现
1. 观察者所在类
1)注册观察者:(一般在viewDidLoad方法中实现)
//name为通知名,作为区分
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleAction:)
name:@"test"
object:nil];
]
- observer:监听器,即谁要接收这个通知
- Selector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入
- Name:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知
- Object:通知发布者。如果Object和Name都为nil,监听器都收到所有的通知
2)接收广播后的处理
-(void)handleAction:(NSNotification*)notification
{
//获取userinfo
NSDictionary *theData = [notification userInfo];
//[notification object] 可获取post的object对象
//作出反应
if (theData !=nil) {
NSString *data =
[theData objectForKey:@"testKey"];
NSLog(@"FlipsideViewController App Terminate Date: %@", data);
}
}
3)解除注册(一般在dealloc方法中解除=注册)
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
2. 被观察的对象
通过postNotificationName:object:userInfo:发送某一类型通知,广播改变。
//传递的数据
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:self.testTextField.text forKey:@"testKey"];
//发出通知(广播)
[[NSNotificationCenter defaultCenter] postNotificationName:@"test"
object:self
userInfo:dataDict];
一个通知对象要包含的内容:
- (NSString *)name; // 通知的名称
- (id)object; // 发送对象类型数据,如果接收者不需要,可设为nil
- (NSDictionary
*)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)
- (NSDictionary
网友评论