转自:http://www.cnblogs.com/cocoajin/p/3600634.html
iOS kvo 结合 FBKVOController 的使用
一:FBKVOControlloer是FaceBook开源的一个 在 iOS,maxOS上使用 kvo的 开源库;
提供了block和@selector(SEL) 的回调操作,很方便实用;
https://github.com/facebook/KVOController
二:示例:
1
2
3
4
5
6
7
8
9
10
11
|
fbKVO = [FBKVOController controllerWithObserver:
self
];
[fbKVO observe:personOne keyPath:@
"pName"
options:
NSKeyValueObservingOptionNew
block:^(
id
observer,
id
object,
NSDictionary
*change) {
//NSLog(@"%@ %@ %@",observer,object,change);
//Person *p = (Person *)object;
//self.title = p.pName;
self
.title = change[
NSKeyValueChangeNewKey
];
}];
|
三:流程操作
1:创建 Person Object
1
2
3
4
5
6
7
|
#import <Foundation/Foundation.h>
@interface
Person :
NSObject
@property
(
nonatomic
,strong)
NSString
*pName;
@end
|
2: 下载FBKVOController---导入FBKVOController.h .m文件 ARC环境
1
2
|
#import "FBKVOController.h"
#import "Person.h"
|
3:创建Person对象(被观察者),及FBKVOController对象(管理观察者与被观察者);
1
2
3
4
5
|
@interface
RootViewController ()
{
Person *personOne;
FBKVOController *fbKVO;
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
self
.title = @
"TEST"
;
listArray = [[
NSMutableArray
alloc]initWithCapacity:5];
[listArray addObject:@
"FBKVOController"
];
personOne = [[Person alloc]init];
personOne.pName = @
"defaultName"
;
fbKVO = [FBKVOController controllerWithObserver:
self
];
[fbKVO observe:personOne keyPath:@
"pName"
options:
NSKeyValueObservingOptionNew
block:^(
id
observer,
id
object,
NSDictionary
*change) {
//NSLog(@"%@ %@ %@",observer,object,change);
//Person *p = (Person *)object;
//self.title = p.pName;
self
.title = change[
NSKeyValueChangeNewKey
];
}];
/**
一:kvo值检测类型;
1: NSKeyValueObservingOptionNew 传递变化之后的值;
2: NSKeyValueObservingOptionOld 传递变化之前的值;
3: NSKeyValueObservingOptionInitial 观察者会在程序初始时,也就是观察变化之前,优化执行一次 观察动作;即上述执行上面 block操作一次;并且传递 默认的值,和以后传递 变化后的值;
4: NSKeyValueObservingOptionPrior 会调用两次观察者操作,值改变之前,值改变之后;
二:获取 kvo的值;
change[NSKeyValueChangeNewKey] 新值;
change[NSKeyValueChangeOldKey] 旧值;
*/
}
|
4:添加改变 被观察者 Person的pName属性值变化操作,然后在 观察者观察到 pName值发生变化时,改变 self.title的值
1
2
3
4
5
6
7
8
9
10
11
|
#pragma mark action 点击
- (
void
)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(
NSIndexPath
*)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:
YES
];
int
nums = arc4random()%10;
personOne.pName = [
NSString
stringWithFormat:@
"newName%d"
,nums];
NSLog
(@
"new --> %@"
,personOne.pName);
}
|
//在 pName属性值发生变化时,改变self.title的值;
1
2
3
4
5
6
7
8
9
10
|
[fbKVO observe:personOne keyPath:@
"pName"
options:
NSKeyValueObservingOptionNew
block:^(
id
observer,
id
object,
NSDictionary
*change) {
//NSLog(@"%@ %@ %@",observer,object,change);
//Person *p = (Person *)object;
//self.title = p.pName;
self
.title = change[
NSKeyValueChangeNewKey
];
}];
|
5:如果想移除观察者:
1
2
3
4
|
//三种方式任你选择;
[fbKVO unobserve:personOne];
[fbKVO unobserve:personOne keyPath:@
"pName"
];
[fbKVO unobserveAll];
|
6: 效果:
改变值之前
改变值之后