Cocoa - 键值观察 (KVO)

键值观察 (KVO) 是 Cocoa 和 Cocoa Touch 框架中的一项编程功能,允许一个对象(观察者)观察其他对象(被观察者)中特定属性的变化。观察者在观察到的属性发生变化时会收到通知,从而使观察者能够做出响应。

KVO 主要用于实现反应式编程模式,其中应用程序一个部分的更新可以触发另一个部分的更新,最终有助于保持对象之间的同步。

它在 macOS 和 iOS 开发中被广泛使用,以促进应用程序不同组件之间的通信。

Cocoa 应用程序中的键值观察 (KVO)

在 Cocoa 应用程序中实现键值观察 (KVO) 涉及几个关键步骤。在本指南中,我们将专门使用 Objective-C。

实现 KVO 的步骤

步骤 1 − 定义可观察属性

在模型类中,首先定义要观察的属性。使用 @property 进行声明。

@interface MyModel : NSObject

@property (nonatomic, strong) NSString *myString;

@end

@implementation MyModel

@end

第 2 步 − 注册观察

在您想要观察属性的类中(例如,视图控制器),在适当的方法(如 viewDidLoad)中注册 KVO。

@implementation MyObserver {
   MyModel *_model;
}

- (instancetype)initWithModel:(MyModel *)model {
   self = [super init];
   if (self) {
      _model = model;
      [_model addObserver:self 
         forKeyPath:@"myString" 
            options:NSKeyObservingOptionNew | NSKeyObservingOptionOld 
            context:nil];
   }
   return self;
}

步骤 3 − 实现观察者方法

现在,您需要实现observeValueForKeyPath:ofObject:change:context:方法来处理或响应对被观察属性的更改。

- (void)observeValueForKeyPath:(NSString *)keyPath 
   ofObject:(id)object 
   change:(NSDictionary<NSKeyValueChangeKey,id> *)change 
   context:(void *)context {
      if ([keyPath isEqualToString:@"myString"]) {
         NSLog(@"myString changed from %@ to %@", change[NSKeyValueChangeOldKey], change[NSKeyValueChangeNewKey]);
      } else {
         [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
      }
}

步骤 4 − 移除观察者

当您不再需要观察者时或在观察对象被释放之前移除观察者以防止崩溃,这一点很重要。

- (void)dealloc {
    [_model removeObserver:self forKeyPath:@"myString"];
}

步骤 5 − 触发更改

您现在可以更改模型类中的属性,观察者将收到更改通知,以查看观察者的响应。

_model.myString = @"New Value"; // This will trigger the observer