iOS面试:addObserver:forKeyPath:options:context:各个参数的作用分别是什么,observer中需要实现哪个方法才能获得KVO回调?

在 iOS 中,KVO(Key-Value Observing)是一种用于观察对象属性变化的机制,而 addObserver:forKeyPath:options:context: 方法是用来注册观察者的。下面是该方法的各个参数及其作用:

addObserver:forKeyPath:options:context: 参数详解

observer:

这个参数指定了观察者对象,也就是当所监控的属性发生变化时,会接收到通知的对象。一般是你在某个类中实例化的对象。

forKeyPath:

这个参数是一个字符串,指定了要观察的属性的键路径。键路径是一个通过点(.)分隔的字符串,表示属性层次结构。例如,假设你想观察一个 Person 对象的 age 属性,你可以传递 "age" 作为键路径。如果你想观察一个 Address 对象的 city 属性,且这个 Address 对象是 Person 的一个字段,则键路径会是 "address.city"

options:

这个参数是一个枚举值,指定了如何观察属性变化的选项。它可以是以下几种组合:

NSKeyValueObservingOptionNew: 在值改变时,通知观察者新值。

NSKeyValueObservingOptionOld: 在值改变时,通知观察者旧值。

NSKeyValueObservingOptionInitial: 注册时立即调用观察者的回调方法,返回初始值。(当观察者第一次添加观察时会触发)

NSKeyValueObservingOptionPrior: 在属性变化发生之前先通知观察者。

context:

这个参数是一个 void * 类型的指针,用于传递任何必要的上下文信息到观察者。通常用于在观察者中区分不同的观察(如:观察同一个对象的不同时刻)或传递状态。如果不需要额外的信息,可以传递 nil

观察者需要实现的方法

为了获取 KVO 回调,观察者需要实现 observeValueForKeyPath:ofObject:change:context: 方法。该方法的定义如下:

- (void)observeValueForKeyPath:(NSString *)keyPath  

                      ofObject:(id)object  

                        change:(NSDictionary<NSKeyValueChangeKey,id> *)change  

                       context:(void *)context {  

    // 处理属性变化  

    if ([keyPath isEqualToString:@"desiredKeyPath"]) {  

        // 在这里处理对 "desiredKeyPath" 属性变化的响应  

        id newValue = change[NSKeyValueChangeNewKey];  

        id oldValue = change[NSKeyValueChangeOldKey];  

        NSLog(@"Value changed from %@ to %@", oldValue, newValue);  

    } else {  

        // 如果观察到其他属性变化,可以调用 super  

        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];  

    }  

}  

方法参数详解

  • keyPath: 指示被观察的属性的路径。
  • object: 发生变化的对象,即你所观察的对象。
  • change: 一个字典,包含了旧值和新值,可以通过 NSKeyValueChangeOldKey 和 NSKeyValueChangeNewKey 来获取旧值和新值。
  • context: 指向你之前传递的上下文信息的指针。

通过 addObserver:forKeyPath:options:context: 方法进行 KVO 注册,能够让观察者在某个对象的指定属性发生变化时获得通知。观察者需要实现 observeValueForKeyPath:ofObject:change:context: 方法来处理这些变化。在实际工作中,正确使用 KVO 可以实现灵活的响应式编程模式,增强应用程序的动态内容更新能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值