zoukankan      html  css  js  c++  java
  • IOS KVO

    KVO  Key-Value Observing  它提供一种机制,当指定的对象的属性被修改后,则观察者就会接受到通知!!

    观察者可以是对象本身,也可以是其他的类对象!!

    使用步骤:

    1.注册观察对象的属性!

    2.实现观察触发的回调方法!

    3.在dealloc中移除观察

     

    下面贴一段测试代码:

    创建一个Person类

    //.h文件
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    @property(nonatomic,copy)NSString *name;
    @property(nonatomic,assign)float height;
    @property(nonatomic,strong)NSMutableArray *array;
    +(Person *)personWithName:(NSString *)aName height:(float)height;
    @end
    
    //.m 文件
    #import "Person.h"
    @implementation Person
    +(Person *)personWithName:(NSString *)aName height:(float)height
    {
        Person *per = [[Person alloc]init];
        per.name = aName;
        per.height = height;
        per.array = [NSMutableArray arrayWithArray:@[@"zzzXXXzzz"]];
        return per;
    }
    @end
    //在需要用的控制器或者类中  注册观察
    _person = [Person personWithName:@"AAA" height:179.5];
    
    [_person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    [_person addObserver:self forKeyPath:@"height" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
    [_person addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];


    //改变观察的属性的值
     
    _person.name = @"BBB";//触发一次观察方法
        _person.name = @"CCC";//触发一次观察方法
        _person.height = 185;//触发一次观察方法
        
        //这种向数组中添加删除数据不会触发观察方法
        [_person.array addObject:@"123"];
        [_person.array addObject:@"456"];
        [_person.array removeObject:@"123"];
        
        //重新给数组赋值,可以触发观察者方法
        _person.array = [@[@"creat",@"a",@"new",@"array"] mutableCopy];

    //在注册观察的类中  实现这个观察回调方法

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
    {
        if ([keyPath isEqualToString:@"name"])
        {
            NSLog(@"改变前的值:%@  ---  改变后的值:%@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
        }
        if ([keyPath isEqualToString:@"height"])
        {
            //you code
            NSLog(@"改变前的值:%@  ---  改变后的值:%@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
        }
        if ([keyPath isEqualToString:@"array"])
        {
            NSLog(@"改变前的值:%@  ---  改变后的值:%@",[change objectForKey:@"old"],[change objectForKey:@"new"]);
        }
    }
    //移除观察
    -(void)dealloc
    {
        [_person removeObserver:self forKeyPath:@"name"];
        [_person removeObserver:self forKeyPath:@"height"];
        [_person removeObserver:self forKeyPath:@"array"];
    }

    文章到这已经结束啦,希望对路过的朋友有所帮助!!!

  • 相关阅读:
    Git工作原理
    将博客搬至CSDN
    Hive常见文件存储格式
    Hadoop进入安全模式源码分析
    Hadoop RPC简介
    hive自定义UDF函数
    hive性能调优之表设计层面调优
    flowable 启用慢 且启动不起来 报错看不懂
    数据结构和算法基础
    css: 边宽弧度
  • 原文地址:https://www.cnblogs.com/Mgs1991/p/5146905.html
Copyright © 2011-2022 走看看