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

    改变值之前

    改变值之后

  • 相关阅读:
    微软程序员最好的时代来了
    领域驱动设计系列 (六):CQRS
    当我谈 "加班有罪" 我在谈什么?
    parquet 简介(转)
    Spark动态资源分配-Dynamic Resource Allocation
    Spark配置参数详解
    PhpStorm使用sftp实现代码自动上传服务器
    docker 命令大全
    mysql 5.6配置
    docker volume
  • 原文地址:https://www.cnblogs.com/cocoajin/p/3600634.html
Copyright © 2020-2023  润新知