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

Optional

Optional 正如其名,就是個可選擇或者說是可有可無的意思。

在 Swift 的開發過程之中,我們可以看到「 ! 」、「 ? 」存在於變數之後,像是  var userName: String? 正式意味著 userName 這個 String 有可能是 nil。

有關 Swift optional 的解釋和 nil 對於 Swift 的介紹可以看看這篇,由小草哥所攥寫的文章。

這邊要補充的是,在 Objective-C 裏頭,則是使用 nonnull 和 nullable 來代表著 Swift 裡頭的「 ! 」、「 ? 」。

而在 Objective-C 之中,可以使用 NS_ASSUME_NONNULL_BEGIN 及 NS_ASSUME_NONNULL_END 來作為區域性的宣告 @property 的屬性為 nonnull;若其中有需要宣告成 nullable 的,則再補上即可。