1,观察者模式的定义:在gof中是这样描述观察者模式的。观察者模式定义了一种一对多的依赖关系。让多个观察者同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知多个观察者对象,让它们自动更新。
2,ios中观察者模式的实现方法有三种:Notification,kvo,以及标准方法。
Notification方法
1)注册通知,即告诉通知中心我对啥感兴趣。
[[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector(doHandleLogInSuccess:)name:@"登录成功" object:nil];
注:doHandleLogInSuccess是自定义的回调方法,即收到通知后我应该去做what。
2)在程序任何一个地方都可以发送通知
[[NSNotificationCenterdefaultCenter]postNotificationName:@"登录成功" object:niluserInfo:nil];
注:还可以通过userInfo这个dic传递数据
kvo方法
介绍:key-value observing.。当被观察者的属性被修改后,kvo就会自动通知各个观察者。
kvo主要用于界面交互,当多个uiview共同作用于一个实体时,当该实体的某个属性改变时,如果需要更新多个页面,则kvo就会很好使。
使用方法:
1)监听者通过addobserver方法注册监听 指定被观察者的属性。
//被监听对象将监听者加入监听者行列
格式:【被监听对象 addObserver 监听者 forKeyPath 被监听对象的属性 options 监视内容(新值或旧值) context 额外信息】
kvoSub = [[KVOSubject alloc] init];
[kvoSub setValue:@"testtestName" forKey:@"name"];
[kvoSub setValue:@"10.0" forKey:@"price"];
//在监听者的类中实现
[kvoSub addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil];
2)观察者实现回调方法
//实现回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"price"]) {
NSLog(@"old price is %@",[changeobjectForKey:@"old"]);
NSLog(@"new price is %@",[changeobjectForKey:@"new"]);
}
}
3)移除观察者。增加观察与取消观察是成对出现的。所以需要在最后的时候取消观察。
- (void)dealloc {
[_priceLab release];
[kvoSub removeObserver:self forKeyPath:@"price"];
[kvoSub release];
[super dealloc];
}
给观察者发送通知时 有两种方式:自动方式和手动方式。其中自动方式是有NSObject实现的一个默认实现。通常情况下,如果你自定义了一个类是从NSObject继承而来,那么该类就已经具有了NSObject的自动通知功能。手动控制方式 需要重写automaticallyNotifiesObserversForKey方法,返回NO。
//改为手动通知方式
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key
{
BOOL automatic = NO;
if ([key isEqualToString:@"price"]) {
automatic = NO;
}
else {
automatic = [super automaticallyNotifiesObserversForKey:key];
}
return automatic;
}
kvo优点:
1)当有属性改变,kvo会自动提供消息通知
2)支持多个观察者观察同一个属性,以及相关的值。