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