文章目录
1. 简介
KVO 是 Key Value Observe 的缩写,主要通过为需要监听的对象属性设置观察者,让观察者接收到属性值改变的消息通知,是 iOS 对观察者模式的一种实现。
2. 基本使用
2.1 设置观察者
当我们需要这个为某个对象设置观察者时,可以使用一下方法:
- (void)addObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(nullable void *)context;
方法中各参数的含义:
-
observer:观察者对象
-
keyPath:需要观察的属性在对象中的路径,相关解释如下:
// 汽车类 @interface Car : NSObject @property (nonatomic, copy) NSString *brandName; // 汽车品牌名称 @end // Person 类 @interface Person : NSObject @property (nonatomic, assign) NSInteger age; // 年龄 @property (nonatomic, strong) Car *car; // 持有的汽车对象 @end Person *p = [Person new]; // 如果要监听这个人的年龄,keyPath 为 @"age" // 如果要监听这个人的汽车的品牌名称,keyPath 为 @"car.brandName"
-
options:监听选项,用于设置属性改变后需要接收的值。该枚举类型的定义如下:
typedef NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) { // 提供属性改变后的新值 NSKeyValueObservingOptionNew = 0x01, // 提供属性改变前的旧值 NSKeyValueObservingOptionOld = 0x02, // 如果指定,则在添加观察者的时候(注册方法返回前)立即发送一个通知给观察者, NSKeyValueObservingOptionInitial API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 0x04, // 如果指定,则在每次修改属性时,会在修改通知被发送之前预先发送一条通知给观察者,与-willChangeValueForKey:被触发的时间是相对应的。 NSKeyValueObservingOptionPrior API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0)) = 0x08 };
-
context:上下文信息,会随着监听到的信息一起传给观察者,可以设置为
nil
。