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.