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"];
    }

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

  • 相关阅读:
    hdu5728 PowMod
    CF1156E Special Segments of Permutation
    CF1182E Product Oriented Recurrence
    CF1082E Increasing Frequency
    CF623B Array GCD
    CF1168B Good Triple
    CF1175E Minimal Segment Cover
    php 正则
    windows 下安装composer
    windows apache "The requested operation has failed" 启动失败
  • 原文地址:https://www.cnblogs.com/Mgs1991/p/5146905.html
Copyright © 2011-2022 走看看