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

改變值之前

改變值之后


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM