码迷,mamicode.com
首页 > 其他好文 > 详细

KVO模式 ———满足猥琐大众的 偷窥模式

时间:2016-05-12 12:30:25      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

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一散人

KVO模式 ———满足猥琐大众的 偷窥模式

标签:

原文地址:http://blog.csdn.net/maxingzehaoren/article/details/51367919

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!