キー値監視
キー値監視は、別のオブジェクトのプロパティが変わった時にオブジェクトが直接通知されることを可能にするメカニズムです。キー値監視(または KVO) は、アプリケーションの凝集性の重要な要因となり得ます。これは、モデル-ビュー-コントローラ・デザインパターンに準拠して設計されたアプリケーション内のオブジェクト間の通信モードです。たとえば、ビューとコントローラ層のオブジェクトとモデルオブジェクトの状態を同期するためにそれを使用できます。一般的には、コントローラ・オブジェクトは、モデルオブジェクトを監視し、ビューはコントローラオブジェクトやモデルオブジェクトを監視します。
注意:UIKit フレームワークのクラスは、一般的に KVO をサポートしていませんが、まだ、カスタムビューを含む、アプリケーションのカスタムオブジェクトでそれを実装できます。
KVO で、一つのオブジェクトは、単純属性、対一の関係、および対多の関係を含め、別のオブジェクトの任意のプロパティを監視できます。オブジェクトは、プロパティの現在および以前の値が何であるかを知ることができます。対多関係の監視者は、加えられた変更の型についてだけでなく、どのオブジェクトが変更に含まれているかも通知されます。
通知メカニズムとしては、キー値監視は NSNotification と NSNotificationCenter クラスが提供するメカニズムと似ていますが、重要な違いもあります。オブザーバーとして登録されたすべてのオブジェクトに通知を放送する中心的なオブジェクトの代わりに、KVO 通知は、プロパティ値の変更が発生した時に、オブジェクトを監視するために直接効果を表します。
KVOの実装
ルートクラス、NSObject は、キー値監視の基本実装を提供し、めったにオーバーライド(上書き) する必要がありません。したがって、すべての Cocoa オブジェクトは、キー値で監視するのが、本質的に可能です。プロパティの KVO 通知を受信するには、以下のことを行う必要があります:
- 監視されるクラスは、監視したいプロパティの、キー値監視に従うこと を確認しなければなりません。
- 値を変更することができる、オブジェクトのオブザーバを追加します。addObserver:forKeyPath:options:context: を呼び出してこの操作を行います。監視者は、アプリケーション内での別のイブジェクトです。
- 監視者オブジェクトでは、observeValueForKeyPath:ofObject:change:context: メソッドを実装します。このメソッドは、監視されているオブジェクトのプロパティの値が変更された時に呼び出されます。
KVO 準拠している側も、監視されるオブジェクトのクラスが KVC に準拠する事も必要とし、プロパティの自動オブザーバ通知を許可またはプロパティのキー値監視を手動で実装するかを必要とします。
KVO はバインディングに不可欠(OS X)
Cocoa バインディングは、モデル内の値を維持し、多くの"グルーコード" を記述することなく、アプリケーションのビューレイヤを同期化できる、OS X の技術です。Interface Builder のインスペクタを通して、ビューのプロパティと、データの一部の間の接続を取り次ぐことができますし、一つの変化が、他にも反映されている"結合" ができます。KVO は、キー値コーディング、キー値結合、および Cocoa バインディングに役立つ技術です。
前提条件の記事
キー値によるコーディング
関連記事
モデル・ビュー・コントローラー
バインディング
既知のディスカッション
キー値監視プログラミングガイド
サンプルコードプロジェクト
SourceView: Using NSOutlineView with NSTreeController
BindingsJoystick