來說說“KVO”吧。

這週持續Debug中,其中的一個問題是“希望在編輯頁面新刪修完資料後,返回列表頁面可以即時看到最新結果”,這時腦袋中,想到的就是“觀察者模式”。

iOS中觀察者模式大致上分兩類:

  1. KVO,即key-value-observing,利用一個key來找到某個屬性並監聽其值得改變。
  2. NSNotification 通知。

在要說KVO是啥前,就要談到KVC這傢伙,也就是key-value-coding,即鍵值編碼,通常是用來給某一個對象的屬性進行賦值。

說真的,一開始看到這說法有點懜了,啥意識,可以吃嗎?然後,看到範例程式碼,就無言了,對我而言,這不就是建立模型。

Person *p = [[Person alloc] init];
p.name = @”wifi”;
p.age = 20;

而使用KVC的就是這樣:

[p setValue:@”wifi” forKey:@”name”];
[p setValue:@20 forKey:@”age”];

既然可以賦值,也就要可以取值。

[p valueForKey:@”name”]

當然,這些都是簡單的用法,KVC這個用法,常用各式轉換模型上面,再高階的用法可以去看看MJExtension這類JSON和模型之間的轉換的庫。


那麼回到主題 KVO,為啥要先提到KVC,主要也是因為KVO的實現都是圍繞的各類模型。

  1. 當指定的模型的屬性被修改後,模型就會收到一個通知。也就是說每次指定的被觀察的模型的屬性被修改後,KVO就會自動通知相應的觀察者。
  2. 優勢:可以降低兩個類(業務邏輯和視圖控制的類)之間的耦合性。也就是說可以很容易的實現視圖組件和數據模型的分離。當數據模型的屬性值改變之後作為監聽器的視圖組件就會被激發,激發時就會回調監聽器自身。
  3. 在Objective-C中要實現KVO則必須實現NSKeyValueObServing協議。但因為NSObject已經實現了該協議,因此幾乎所有的Objective-C模型都可以使用KVO。

要如何用KVO,主要就三步:

  1. 添加觀察者
  2. 在觀察者中實現監聽方法,observeValueForKeyPath: ofObject: change: context:(通過查閱文檔可以知道,絕大多數對像都有這個方法,因為這個方法屬於NSObject
  3. 移除觀察者

缺點:

原生的KVO API 說真的很不好使用,要分別對觀察者及被觀察者分別去實現不同的事情,而且只能在apple所提供的方法中處理,不能使用常態用的blockc或Target-Action等方式,也不能忘記要移除觀察者,不然有就可能會死給你看。。。

不過網上也有很多人提出很多優化使用的方法,就各自去爬爬看了。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.