zoukankan      html  css  js  c++  java
  • iOS 监听数组的变化

    这里用的是KVO的方式来实现的,

    首先有一个 testArray 这个数组需要监听里面的数据变化

       NSMutableArray *testArray;

    然后给这个数组注册监听

      testArray = [NSMutableArray array];

      [self addObserver:self forKeyPath:@"testArray" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

    其中 forKeyPath 就是 你定义的这个数组的名字。

    具体实现代码如下:

    #import "ViewController.h"

    @interface ViewController ()

    {

        NSMutableArray *testArray;

    }

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        testArray = [NSMutableArray array];

        //注册监听

        [self addObserver:self forKeyPath:@"testArray" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

        // Do any additional setup after loading the view, typically from a nib.

    }

    -(IBAction)clickBtn:(id)sender

    {

        //给数组添加数据

        [[self mutableArrayValueForKey:@"testArray"] addObject:@"1"];

    }

    //回调方法

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

    {

        NSLog(@"keyPath = %@", keyPath);

        NSLog(@"object = %@", object);

        NSLog(@"change = %@", change);

        

    }

     这里需要注意的是这个数组添加对象的方式跟平时用的有点不一样,如果用常规的

    [testArray addObject:@"1"]是无法触动监听的,这里需要用到这个方法才能触发

     [[self mutableArrayValueForKey:@"testArray"] addObject:@"1"],

    关于mutableArrayValueForKey:的适用场景,发现其一般是用在对NSMutableArray添加Observer上。如果对象属性是个NSMutableArray、NSMutableSet、NSMutableDictionary等集合类型时,你给它添加KVO时,你会发现当你添加或者移除元素时并不能接收到变化。因为KVO的本质是系统监测到某个属性的内存地址或常量改变时,会添加上- (void)willChangeValueForKey:(NSString *)key- (void)didChangeValueForKey:(NSString *)key方法来发送通知,所以一种解决方法是手动调用者两个方法,但是并不推荐,你永远无法像系统一样真正知道这个元素什么时候被改变。另一种便是利用使用mutableArrayValueForKey:了。
  • 相关阅读:
    c#时间函数
    .NET中的lock(C#版本)
    关于OpenSmtp邮件标题过长,附件名,用户名出现乱码问题的终及解决Dll文件
    Windbg 用法
    使用OpenXML将数据导入到Excel模板中
    Compiere源码workspace的两个配置文件内容
    我学MEF系列(8):MEF+Unity实现可扩展拦截器
    基于插件架构的简单的Winform框架(上)
    我学Flash/Flex(2):AS3读取XML文件内容
    我学Flash/Flex(1):Action Script3.0基础知识
  • 原文地址:https://www.cnblogs.com/cui-cui/p/9234333.html
Copyright © 2011-2022 走看看