KVOController

KVOController

有關 Observe 的相關做法,在 Swift 上我會選擇使用 RxSwift,那 Objective-C 呢? 在這邊簡單介紹一下 KVOController 的 solution 給 Objective-C 的開發者。 在 NSObject 的子類別下,都會繼承到一個 FBKVOController 的物件,名字為 KVOController; 而這邊要使用的 method 是這個:

(void)observe:(nullable id)object keyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options block:(FBKVONotificationBlock)block;

object 是我們要觀察的物件 keyPath 是 object 底下的要觀察的值,它的名稱(key) options 則是填入 NSKeyValueObservingOptions block 再來決定當 object 的 keyPath 那物件有更動時,要做些什麼事

舉個例子

[self.KVOController observe:self
                            keyPath:NSStringFromSelector(@selector(observeObjectName))
                            options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew
                              block:^(id  _Nullable observer, id _Nonnull object, NSDictionary<NSString *,id> * _Nonnull change) {
                            //do something
}];
  • observe:self
  • keyPath:NSStringFromSelector(@selector(observeObjectName))

翻成白話文就是 self 去觀察 self.observeObjectName 的 value 變化。

  • block 裡頭的 observer = 觀察的物件,object 則是被觀察的物件

在這個例子之中,observer 剛好和 object 是同一個物件(self), 而我們可以在 //do something 裡頭寫些東西,像是當 observeObjectName 有值更動時,畫面上 UILabel 的 text 會跟著改變之類的。

不過這邊要注意兩點

KVOController 不像 RxCocoa 一樣,有提供 observe UIKit 物件的功能。 readonly 的物件,因為 observe 為監聽 set 的動作,若是直接使用 _observeObjectName = @””; 的方式,則不會被監聽到。

comments powered by Disqus