KVO模式浅谈-满足猥琐男的偷窥模式
马仔哥
KVO模式 Key-Value Observing 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
KVO其实也是“观察者”设计模式的一种应用。我的看法是,这种模式有利于两个类间的解耦合,尤其是对于 业务逻辑与视图控制 这两个功能的解耦合。
我自己的看法:我一般把KVO模式称为 偷窥模式 ,很形象,因为建立一个观察者,并且用到的回调函数,被观察者根本不知道,所以我把KVO 模式叫做偷窥者模式,感觉真的很形象。
闲话不说用一个很简单的OC程序来更加直观的来理解
首先创建一个person类
.h文件的内容
““
import
import “BankAccount.h”
@interface Person : NSObject{
BankAccount * bankAccount;
}
//打开监听银行账号的能力
- (void)registerAsObserver;
@end
““
.m文件
“`
#import “Person.h”
@implementation Person
-(id)init{
self =[super init];
if(self){
bankAccount =[[BankAccount alloc]init];
}
return self;
}
//OpeningBalance 指向自己的指针
static void * openingBalance =(void *)&openingBalance;
- (void)registerAsObserver{
//监听银行账号的变化 context 后面跟一个不相同的数
[bankAccount addObserver :self forKeyPath:@"openingBalance" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:openingBalance];
/*
给银行账号bankAccount增加一个新的监听 self ,监听openingBalance的变化过程 只要openingBalance 有变化,就会调用下面的方法
*/
}
// 这个方法就是监听的回调函数
//就是说bankAccount 里面只有openingBalance有变化了,就会调用下面的这个方法
// keyPath 表示之前监听的key就是 openingBalance
// object表示bankAccount
// change是一个字典 里面包含了新,旧 的值
//context 是私有变量OpeningBalance
- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary
创建银行的账户类 BankAccount
.h文件
““
#import
.m文件
““
#import “BankAccount.h”
@implementation BankAccount
- (id)init{
self =[super init];
if(self){
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(balanceUpdate) userInfo:nil repeats:YES];
}
return self;
}
- (void)balanceUpdate{
float f =self.openingBalance;
f +=arc4random()%100;
//切记不可以这么写 这样写会没有任何的变化
// _openingBalance=f;
//写法一
self.openingBalance=f;
//写法二
//[self setOpeningBalance:f];
//写法三 kVC 写法
//[self setValue:[NSNumber numberWithFloat:f] forKey:@"openingBalance"];
//写法四
//[self willChangeValueForKey:@"openingBalance"];
//_openingBalance=f;
//[self didChangeValueForKey:@"openingBalance"];
}
@end
““
在main函数中调用
““
#import
运行的结果如下
2016-05-10 23:32:52.415 KVO[509:11870] how
2016-05-10 23:32:53.421 KVO[509:11870] 新的值 59,旧的值0
2016-05-10 23:32:54.423 KVO[509:11870] 新的值 66,旧的值59
2016-05-10 23:32:55.421 KVO[509:11870] 新的值 130,旧的值66
如果有不明白的 ,请在我的博客上留言,我会第一时间回复。
马仔哥:
更多分享请关注微博 IT一散人