KVOController

KVOController

有關 Observe 的相關做法,在 Swift 上我會選擇使用 RxSwift,那 Objective-C 呢?

在這邊簡單介紹一下 KVOController 的 solution 給 Objective-C 的開發者。

在 NSObject 的子類別下,都會繼承到一個 FBKVOController 的物件,名字為 KVOController;

而這邊要使用的 method 是這個:

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

舉個例子

  • observe:self
  • keyPath:NSStringFromSelector(@selector(observeObjectName))

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

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

在這個例子之中,observer 剛好和 object 是同一個物件(self),

而我們可以在 //do something 裡頭寫些東西,像是當 observeObjectName 有值更動時,畫面上 UILabel 的 text 會跟著改變之類的。

不過這邊要注意兩點

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

七天學會設計模式 – Observe

訂閱

有使用過網誌或是一些新聞類型的網站時,通常可以在旁邊看到「訂閱」的按鈕,接著點擊下去後就可以在作者有發動或異動文章時,收到通知。

Observe

這個設計模式的概念類似於「訂閱」的功能,我們會去「訂閱」某個物件,當它做了某些事情或者其值改變時,可以去做相對應的動作。

應用

舉個比較常會遇到的案例:鍵盤

我們通常會希望在鍵盤升起來時,調整我們的畫面,看是移動 View 的 frame,或是設定 TableView 的 ContentOffset 之類的。

而大多數採取的方式是「監聽」 NotificationCenter 的「鍵盤升起」的事件,所以當「鍵盤升起」時,我們可以做相對應的處理;而當「鍵盤收起」時,我們也可以執行另一段 function。

這,便是 Observe 的設計模式。

我們去「訂閱」或者「監聽」某個事件,像是 Value changed 或是某個 function 被呼叫,來做相對應的處理。

第三方套件

RxSwiftReactiveCocoa 便都是圍繞在 Observe 設計模式的框架,來做響應式的開發。

響應式開發

如名稱所述,意思是指當 Model 或者 ViewModel 的狀態(值)更動時,畫面可以很即時地跟著變動。

對 RxSwift 有興趣的人,可以看看這篇文章 線上讀書會 RxSwift 影片分享