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