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:了。

猜你喜欢

转载自www.cnblogs.com/cui-cui/p/9234333.html