iOS kvo 结合 FBKVOController 的使用

来源:互联网 发布:中华大字典软件 编辑:程序博客网 时间:2024/05/18 02:04

转自: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: 效果:

改变值之前

改变值之后

0 0
原创粉丝点击