Swift. Key-Value Observing

通知物件關於關於其他物件屬性的更改。

Jeremy Xue
Jeremy Xue ‘s Blog

--

Photo by José Ramon Martinez on Unsplash

Key-Value Observing (KVO)是一種 Cocoa 程式設計模式,用於通知物件關於其他物件屬性屬性的更改。它對於在應用程序中邏輯分離部份間溝通更改非常有用,像是 Model 與 View 之間。你只能使用從 NSObject 繼承的類別使用 Key-Value Observing。

NSObject 為大多數 Objective-C 類別階層的根類別(Root Class),其子類別從中繼承了 runtime system 的基本街口作為 Objective-C 物件的能力。。

▸ 註解 Key-Value Observing 的屬性

使用 @objc 特性和 dynamic 修飾福標記要透過 Key-Value Observing 來觀察的屬性。下面的範例定義了 MyObjectToObserve 類別,該類別具有 myDate 可被觀察的屬性:

▸ 定義觀察者

觀察者類別的實例管理一個或多個更改訊息。當你創建一個觀察者時,你透過呼叫 observe(_:options:changeHandler:) 方法開始觀察,其中的 keypath 指向你想要觀察的屬性。

下方的範例中,\.objectToObserve.myDate 的 keypath 指向 MyObjectToObservemyDate 屬性:

你使用 NSKeyValueObserverdChange 實例中的 oldValuenewValue 屬性來查看你觀察的屬性發生了什麼變化。

如果你不需要知道屬性如何更改,請忽略 options 參數。省略 options 參數會放棄存儲新值和舊值,這會導致 oldValuenewValue 屬性為 nil。

而 options 參數可以使用入以下內容:

  • new:表示更改字典應要提供新的屬性值(如果適用)
  • old:表示更改字典應要包含舊的屬性值(如果適用)
  • initial:如果指定,則在觀察者註冊方法返回之前應立即向觀察者發送通知。
  • prior:是否應該在每次更改前後向觀察者發送單獨的通知,而不是更改後的單個通知。

▸ 關聯觀察者與要觀察的屬性

透過將物件傳遞給觀察者的初始化器,你可以將要觀察的屬性與其觀察者相關聯:

▸ 響應屬性更改

設置為使用 Key-Value Observing 的對象(如上述的 observed),通知他們的觀察者關於屬性的更改。下面的範例會透過 updateDate 方法更改 myDate 屬性,該方法會自動觸發觀察者的 changeHandler

▸ 後記:

本次介紹 Key-Value Observing 這篇,這種寫法有點像是在 Swift 中寫 Objective-C 的感覺,因為它需要使用到 @objcdynamic ,並且這段觀察只在於 Model 到 View 上,但是似乎沒有比較好的方式從 View 更新 Model 資訊(因為 UIKit 不是以 KVO 所設計的,即使他可以這樣使用)。

但是,寫這篇文章的時候 Combine 也問世了,我們應該可以透過 Combine 提供新的方式來取代這部分的編寫方式,像是 Published 之類的操作,也能夠達成一樣的效果。

--

--

Jeremy Xue
Jeremy Xue ‘s Blog

Hi, I’m Jeremy. [好想工作室 — iOS Developer]