iOS面试:如何手动触发一个value的KVO?

在 iOS 开发中,手动触发一个属性的 KVO(Key-Value Observing)更新,通常是在属性的值在代码中发生变化时,确保观察者能够收到这些变化的通知。虽然 KVO 通常是在观察某些属性变化时自动通知观察者的,但如果你在代码中直接设置属性值,而没有调用 KVO 的相关方法,观察者将不会察觉到这些变化。

为了手动触发 KVO 通常需要使用 KVO 的合规性,主要是通过 willChangeValueForKey: 和 didChangeValueForKey: 方法。下面是一个示例展示如何手动触发 KVO 通知:

示范代码

假设你有一个 Person 类,它有一个 age 属性,你希望在修改该属性时手动通知观察者。

@interface Person : NSObject  

@property (nonatomic) NSInteger age;  

@end  

@implementation Person  



- (void)setAge:(NSInteger)age {  

    // 手动触发 KVO 通知,通知变化即将发生  

    [self willChangeValueForKey:@"age"];  

    

    // 设置属性值  

    _age = age;  



    // 手动触发 KVO 通知,通知变化已经发生  

    [self didChangeValueForKey:@"age"];  

}  

@end  

使用 KVO

为了让观察者知道 age 属性的更改,你可以在其他对象中添加观察者:

Person *person = [[Person alloc] init];  

[person addObserver:self   

          forKeyPath:@"age"   

             options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld   

             context:nil];  

// 更改年龄来触发 KVO 通知  

person.age = 30;  

观察者实现回调

在你的观察者类中实现 observeValueForKeyPath:ofObject:change:context: 方法,来处理属性变化的回调:

- (void)observeValueForKeyPath:(NSString *)keyPath   

                      ofObject:(id)object   

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

                       context:(void *)context {  

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

        id oldValue = change[NSKeyValueChangeOldKey];  

        id newValue = change[NSKeyValueChangeNewKey];  

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

    } else {  

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

    }  

}  

通过在自定义 set 方法中调用 willChangeValueForKey: 和 didChangeValueForKey: 方法,你可以手动触发 KVO 通知,确保观察者得知属性的变化。这种方式不仅遵循 KVO 的规范,同时还能有效触发对属性变化的观察反应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值