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:了。
  • 相关阅读:
    SpringBoot接口文件findBy方法写错导致抛出IllegalArgumentException
    用tomcat启动spring-boot
    Idea使用tool window中的persistence功能一键生成数据库实体
    Idea 启动 tomcat 报错
    详细梳理ajax跨域4种解决方案
    他们权利意识强,但是也会为生活牺牲很多
    每月碎碎念 | 2019.09
    说好不哭 我不会走
    css实现内容不相同的左右两个div等高
    简单了解css3轮廓outline
  • 原文地址:https://www.cnblogs.com/cui-cui/p/9234333.html
Copyright © 2011-2022 走看看