Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC


オブジェクトライフサイクルの管理

適切に設計されたアプリケーションでは、ユーザエラーの場合にどんな変更もアンドゥおよびリドゥできるようにします。また、属性値が適切であることを保証し、オブジェクト間の関係に変更が加えられてもオブジェクトグラフの整合性を維持できるようにします。最後に、ユーザインターフェイス要素とそれらの要素が表示するデータ値の同期を維持できるようにします。従業員情報アプリケーションでは、ユーザが従業員の属性を編集できるようにします。たとえば、改名や給与の増額を反映できるようにします。個々の従業員に変更があったり、従業員が雇用、解雇、または異動されたときには、変更を追跡する必要があります。さらに、給与の金額に上限と下限を設定するなど、ビジネスロジックも適用できます。

このセクションの内容:

変更管理
値の検証
関係の管理
ユーザインターフェイスの同期維持

変更管理

従来の Cocoa アプリケーションでは、アンドゥとリドゥをサポートするためには、データを変更するすべてのアクションをアンドゥマネージャに記録する必要があります。ファイルのオープンと保存をサポートするには、適切なメソッドを実装またはオーバーライドし、モデルクラスに NSCoding メソッドを実装する必要があります。

Core Data フレームワークは、アンドゥおよびリドゥを自動的にサポートし、より汎用の変更管理を提供します。管理対象オブジェクトは管理対象オブジェクトコンテキストに関連付けられています。管理対象オブジェクトコンテキストは、それぞれにアンドゥマネージャを維持します。このコンテキストはキー値監視を使用して、登録オブジェクトに対する変更を追跡します。通常のアクセサメソッド、キー値コーディング、またはカスタムクラスを対象に定義するキー値監視対応メソッドを使用して、管理対象オブジェクトのプロパティに必要な変更を加えることができます。コンテキストは、適切なイベントをアンドゥマネージャに登録します。

外部ストアに変更をコミットするには、コンテキストに対して「save」メッセージを送ります(コンテキストを対象に save が呼び出されるまで、変更はメモリに保持されます)。操作を取り消す(アンドゥする)には、管理対象オブジェクトコンテキストに適切なメッセージを送るだけです。最後の保存操作以降に加えたすべての変更を元に戻すこともできます。アンドゥ管理は一時プロパティ(永続ストアに保存されないけれども、管理対象オブジェクトモデルの中で指定されているプロパティ)にも及びます。

多くの点で、コンテキストはスクラッチパッドとして機能します。コンテキストにオブジェクトを登録し、オブジェクトに一時的な変更を加え、変更を意のままにアンドゥおよびリドゥし、変更をコミットするかすべて破棄することができます。

値の検証

Core Data フレームワークは、オブジェクトモデルにカプセル化されたロジックおよびカスタムコードの両方による検証をサポートするためのクリーンなインフラストラクチャを提供します。無効なデータが記録されないように変更を外部ストアにコミットする前に、モデルベースの制約がチェックされ、検証メソッドが自動的に呼び出されます。必要な場合は、プログラムからそれらを呼び出すこともできます。

管理対象オブジェクトモデルでは、属性値の制限を指定することができます。たとえば、従業員の給与はマイナスにできないことや、1,000,000 を超えることができないといった制限です。文字列属性の場合は、値が一致しなければならない正規表現を指定することができます。管理対象オブジェクトクラスでは、カスタムメソッドを実装することもできます。

カスタム検証メソッドには 2 つの形態があります。標準のキー値コーディング規約に準拠して 1 つの属性の値を検証するメソッドと、ライフサイクルのさまざまな段階(挿入、更新、および削除)でオブジェクト全体を検証する特別なメソッド集合です。後者は特に値の組み合わせを検証するのに役立ちます。たとえば、従業員が営業部門の一員である場合は、給与の少なくとも 10% が歩合制で評価されるようにする場合などです。

関係の管理

ほとんどの関係は本質的に双方向です。オブジェクト間の関係に変更が加えられた場合には、オブジェクトグラフの整合性を維持する必要があります。

従業員の上司に対する関係は、上司と当該上司の従業員間の逆の関係が存在することを暗示します。特定の上司に新しい従業員を割り当てた場合、その上司がその責任を認識できるようにすることが重要です。新しい従業員を、上司が報告を受ける人のリストに追加する必要があります。従業員の部署を異動する場合は、図 1 に示すように、いくつかの変更を加える必要があります。従業員の新しい部署を設定し、前の部署の従業員リストから従業員を取り除き、新しい部署の従業員リストに従業員を追加します。


図 1:新しい部署への従業員の異動

図 1 新しい部署への従業員の異動


Core Data フレームワークがなければ、オブジェクトグラフの整合性を維持するために数行のコードを記述する必要があります。さらに、逆の関係を設定するかどうかを判断するために(これは、アプリケーションが進化すると変わる可能性があります)、Department クラスの実装をよく知っている必要もあります。Core Data フレームワークを使用すれば、これをすべて 1 行のコードで達成することも可能です。

[anEmployee setValue:newDepartment forKey:@"department"];

このフレームワークは、管理対象オブジェクトモデルを参照することにより、オブジェクトグラフの現在の状態から、どの関係を確立する必要があり、どれを破棄する必要があるかを自動的に決定します。

ユーザインターフェイスの同期維持

オブジェクトのプロパティ値に加えられた変更はユーザインターフェイスに反映される必要があります。また、同じプロパティを表示するユーザインターフェイス要素の同期を維持する必要があります。たとえば、ユーザがテキストフィールドに従業員の新しい給与金額を入力したとき、その従業員の給与がテーブルビューのセルにも表示されている場合、テーブルビューも入力に応じて更新される必要があります。

Core Data フレームワークは、Cocoa バインディングとシームレスに組み合わせて使用でき、その有用性を強化するように設計されています。Cocoa バインディングは Cocoa に対しコントロールレイヤーを提供しますが、Core Data フレームワークがモデルに焦点を合わせているのに対して、Cocoa バインディングはユーザインターフェイスに重点を置いているため、ユーザインターフェイスの同期を正しく維持しやすくなります。

Cocoa バインディングテクノロジーは、Core Data フレームワークが提供する管理対象オブジェクトモデルと関連機能を十分に認識しています。Core Data フレームワークは、以下のような機能を含む NSObjectController および NSManagedArrayController の両カテゴリを提供します。

また、永続ストアからのオブジェクトの受信に使用するのと同じ述部オブジェクトおよびソート記述子を使用して、(たとえば、テーブルビューに表示するために)メモリ内のオブジェクトのフィルタリングおよびソートを実行できます。つまり、これはアプリケーション全体で使用できる一貫した API セットとなります。

これらの機能の組み合わせによって、モデル内に存在する検証ルールを含め、オブジェクトモデルを完全に認識することのできる、リッチでフル機能のユーザインターフェイスを簡単に作成することが可能となります。そして結果として得られるユーザインターフェイスは、基礎をなすオブジェクトグラフの表示と編集をサポートします。たとえば、図 2 に、ユーザが、テーブルビューで選択した従業員をある部署から別の部署に、ポップアップメニューを使用して異動できるユーザインターフェイスを示します。


図 2:従業員を部署間で異動するユーザインターフェイス

図 2 従業員を部署間で異動するユーザインターフェイス


Cocoa バインディングおよび Core Data フレームワークなしに、図 2 に示したインターフェイスを、機能するように作成するには相当な労力を必要とします。以下の操作が必要になります。

Cocoa バインディングおよび Core Data フレームワークを使用すれば、まったくコードなしで、このインターフェイスを機能させることができます。





Preliminary Last updated: Tiger




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice