Swift. Key-Value Observing
通知物件關於關於其他物件屬性的更改。
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 指向 MyObjectToObserve
的 myDate
屬性:
你使用 NSKeyValueObserverdChange
實例中的 oldValue
和 newValue
屬性來查看你觀察的屬性發生了什麼變化。
如果你不需要知道屬性如何更改,請忽略 options
參數。省略 options
參數會放棄存儲新值和舊值,這會導致 oldValue
和 newValue
屬性為 nil。
而 options 參數可以使用入以下內容:
new
:表示更改字典應要提供新的屬性值(如果適用)old
:表示更改字典應要包含舊的屬性值(如果適用)initial
:如果指定,則在觀察者註冊方法返回之前應立即向觀察者發送通知。prior
:是否應該在每次更改前後向觀察者發送單獨的通知,而不是更改後的單個通知。
▸ 關聯觀察者與要觀察的屬性
透過將物件傳遞給觀察者的初始化器,你可以將要觀察的屬性與其觀察者相關聯:
▸ 響應屬性更改
設置為使用 Key-Value Observing 的對象(如上述的 observed
),通知他們的觀察者關於屬性的更改。下面的範例會透過 updateDate
方法更改 myDate
屬性,該方法會自動觸發觀察者的 changeHandler
:
▸ 後記:
本次介紹 Key-Value Observing 這篇,這種寫法有點像是在 Swift 中寫 Objective-C 的感覺,因為它需要使用到 @objc
和 dynamic
,並且這段觀察只在於 Model 到 View 上,但是似乎沒有比較好的方式從 View 更新 Model 資訊(因為 UIKit 不是以 KVO 所設計的,即使他可以這樣使用)。
但是,寫這篇文章的時候 Combine 也問世了,我們應該可以透過 Combine 提供新的方式來取代這部分的編寫方式,像是 Published
之類的操作,也能夠達成一樣的效果。