KVO:(Key-Value-Observer)键值观察者,是观察者设计模式的一种具体实现
KVO触发机制:一个对象(观察者),监测另一对象(被观察者)的某属性是否发生变化,若被监测的属性发生的更改,会触发观察者的一个方法(方法名固定,类似代理方法)
KVO使用步骤:
1、注册观察者(为被观察者指定观察者以及被观察属性)?
2、实现回调方法
?3、触发回调方法(被观察属性发生更改)
4、移除观察者
1 #import "ViewController.h" 2 3 @interface ViewController () 4 /// 观察可变数组的改变情况(苹果官方文档不建议对数组进行观察) 5 @property (nonatomic, strong) NSMutableArray *array; 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 /** 13 * KVO 键值观察 是观察者设计模式 14 */ 15 // 初始化数组 16 self.array = [NSMutableArray array]; 17 self.array = [@[@"1"] mutableCopy]; 18 // 1、注册观察者 19 // 参数1: 指注册 KVO 通知的对象。观察者必须实现 observeValueForKeyPath:ofObject:change:context: 以对被观察对象的改变做出响应。 20 // 参数2:指相对于被观察者的属性,此值必须不能为 nil。 21 // 参数3:定义的常量值的组合,这些值指定了在发出的观察通知中会包含哪些东西。不同的指定值会导致观察通知中包含的值不同。 22 /** 23 NSKeyValueObservingOptionNew 表示 change 字典中应该包含监听对象的新属性值 24 NSKeyValueObservingOptionOld 表示 change 字典中应该包含监听对象的旧属性值,即改变前的值 25 NSKeyValueObservingOptionInitial 如果设定了该值,在注册观察者的方法返回之前就会发送通知给观察者 26 NSKeyValueObservingOptionPrior 使得被观察对象的值在改变之前和改变之后都会发送通知,而不仅仅是在改变之后发送一个通知 27 */ 28 // 参数4:该值可以是任一数据值,会在 observeValueForKeyPath:ofObject:change:context: 中传递给 anObserver,也就是这个参数值与 observeValueForKeyPath:ofObject:change:context: 的 context 参数的值相等 29 [self addObserver:self forKeyPath:@"array" options:NSKeyValueObservingOptionNew context:nil]; 30 } 31 32 // 2、实现回调方法 33 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { 34 // 可以进行刷新UI的操作 35 // keyPath 指相对于被监听对象 object 的键路径 36 // object 指键路径 keyPath 所属对象,即被监听对象 37 // change 描述被监听属性的变化信息 38 // context 注册 KVO 时由监听者提供,见上面关于context 的描述 39 NSLog(@"keyPath = %@", keyPath); 40 NSLog(@"object = %@", object); 41 NSLog(@"change = %@", change); 42 } 43 44 // 3、触发可变数组进行改变 45 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { 46 NSArray *subArray = @[@"2", @"3", @"4"]; 47 // 根据keyPath获取到可变数组对象 48 // setArray 给可变数组对象设置数据 49 [[self mutableArrayValueForKeyPath:@"array"] setArray:subArray]; 50 NSLog(@"========%@", self.array); 51 } 52 53 // 视图将要消失 54 - (void)viewWillDisappear:(BOOL)animated { 55 // 移除观察者 56 [self removeObserver:self forKeyPath:@"array"]; 57 } 58 59 @end
参考博客:http://blog.csdn.net/CaryaLiu/article/details/49256477#comments
时间: 2024-11-05 11:53:42