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 = @””; 的方式,則不會被監聽到。