了解 Objective-C 上的 KVO(Key-Value Observing) 機制

ref:http://blog.riaproject.com/objective-c/2147/了解-objective-c-上的-kvokey-value-observing-機制.html

在很多的程式語言中都會有 data-binding 的機制,那麼在 Objective-C 中有嗎?答案是有的,不過他不稱為 data-binding ,他在 Objective-C 中稱為 KVO (Key-Value Observing),光從名字來看就會知道他可以讓你去偵測某個 Key 中的 Value 是否有被變動,這樣就可以提供開發者比較簡便的方法來當數值變動時會牽動其他程式的運作,所以今天我們就來講一下 KVO 吧。
依照以前的慣例,我們用一個非常簡單的例子來講這段,這樣大家就不需要看到這麼多的 code ,可以專心在了解 KVO 的運作方法。
首先建立一個 SimpleModel ,有趣的地方只有在我自己建的 name setter ,你可以看到我執行了 willChangeValueForKey 和 didChangeValueForKey 來自己觸動 KVO 的機制,當然如果你現在看不懂也沒有關係,當你沒有實作 setter 前,其實 KVO 機制自己會進行處理,我只是順手示範了一下想要自己作時該如何進行,其他部分都算蠻單純的,所以就不解釋了。

在使用 KVO 之前,你不需要先告知你要偵聽哪個 Key 的改變,所以你會看到我在 view 啓動時就用了 addObserver 來加入偵聽動作。

一但你加了偵聽動作後,只要有被你偵聽的 key 質改變時,就會自動去呼叫 observerValueForKeyPath 這個方法,並把受更改的 key 和更改的內容傳回來,這樣你就可以做一些邏輯的判斷和處理,在這個示範中我是確認當更改的 key 是 name 時,我就將更改前與更改後的值吐到一個名為 _infoLabel 的文字中做顯示,其結果如下:

程式剛啟動時將 SimpleModel 中的 name 屬性預設值顯示在畫面上,然後你可以點選上方的按鈕來改變 name 的數值。

你可以看到我故意將數值印在 Console 中,你可以看到 keypath 和 change 傳回的內容,應該可以非常容易看出它的運作方法。

運算完的結果如上圖,直接把結果印出。
所以看完這個展示,你應該就對 KVO 的運作方法有認識了,所以當你考慮想要作出 data-binding 的效果時, KVO 就是在 Objective-C 中其中一種時作的方法。

其他類似的方法還有 NSNotification 和 Delegate 這兩個機制,當然每種所運用的時機是截然不同的,在這篇我就不講了,若是有機會的話我在跟大家分享。

虹光大成就-密教灌頂(一)