KVOController
有關 Observe 的相關做法,在 Swift 上我會選擇使用 RxSwift,那 Objective-C 呢?
在這邊簡單介紹一下 KVOController 的 solution 給 Objective-C 的開發者。
在 NSObject 的子類別下,都會繼承到一個 FBKVOController 的物件,名字為 KVOController;
而這邊要使用的 method 是這個:
https://gist.github.com/ArchieR7/7c7952d69bcdc803ea1753ca6ea0ca6d
- object 是我們要觀察的物件
- keyPath 是 object 底下的要觀察的值,它的名稱(key)
- options 則是填入 NSKeyValueObservingOptions
- block 再來決定當 object 的 keyPath 那物件有更動時,要做些什麼事
舉個例子
https://gist.github.com/ArchieR7/6af2af9f79a51a53b2093458109f5155
- 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 = @””; 的方式,則不會被監聽到。