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
广告
© . All rights reserved.