iOS kvo 结合 FBKVOController 的使用

iOS kvo 结合 FBKVOController 的使用

一:FBKVOControlloer是FaceBook开源的一个 在 iOS,maxOS上使用 kvo的 开源库;

    提供了block和@selector(SEL) 的回调操作,很方便实用;

   https://github.com/facebook/KVOController

二:示例:

    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

#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic,strong)NSString *pName;

@end

 2: 下载FBKVOController---导入FBKVOController.h   .m文件   ARC环境

#import "FBKVOController.h"
#import "Person.h"

 3:创建Person对象(被观察者),及FBKVOController对象(管理观察者与被观察者);

@interface RootViewController ()
{
    Person *personOne;
    FBKVOController *fbKVO;
}

  

- (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的值

#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的值;

    [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:如果想移除观察者:

    //三种方式任你选择;
    [fbKVO unobserve:personOne];
    [fbKVO unobserve:personOne keyPath:@"pName"];
    [fbKVO unobserveAll];

  

6: 效果:

改变值之前

改变值之后

posted @ 2014-03-14 15:12  cocoajin  阅读(3990)  评论(0编辑  收藏  举报