EODelegateFetching
2007/03/30 (Fri) 22:07:46 JST
EOFの挙動を大幅に変更できるデリゲートが数多く用意されています。 変更の保存 (EODelegateSaving) と組み合わせると、EOFを強化する、もしくは全く違うコンセプトのフレームワークもできそうです。 実装は大変でしょうが。
EOEditingContext.editingContextShouldFetchObjects
- フェッチ時(objectsWithFetchSpecification)から呼ばれ、フェッチするかどうかを決める。 nullを返してそのままフェッチ処理を続けるか、代わりの結果を配列で返す。 このデリゲートを使うと独自のキャッシュ処理を実装ことができる。
EODatabaseContext.databaseContextShouldFetchObjects
- フェッチ操作を続けるかどうかを決める。 nullを返してそのままフェッチ処理を続けるか、代わりの結果を配列で返す。
EODatabaseContext.databaseContextShouldSelectObjects
- ?EODatabaseChannel.selectObjectsWithFetchSpecificationから呼ばれる。 trueを返すとSQLのSELECT文の処理を続けるが、falseを返すとSELECT文の処理が終了する。
EODatabaseContext.databaseContextShouldUsePessimisticLock
- ペシミスティックロックを使うかどうか決める。 trueを返すと現在のロックの設定に関わらずペシミスティックロックを使うようになる。
EOAdaptorChannel.adaptorChannelShouldSelectAttributes
- SELECT文を発行するかどうかを決めるときに呼ばれる。 falseを返すとSELECT文を発行しない。 trueを返すとモデルの設定に従ってSELECT文に含める列を決定され、SELECT文が発行される。 デリゲートを使って独自にフェッチを行う場合はfalseを返すようにする。
EOAdaptorChannel.adaptorChannelDidSelectAttributes
- SELECT文の発行後に呼ばれる。
EODatabaseContext.databaseContextDidSelectObjects
- SELECT文の発行後、EODatabaseContext.selectObjectsWithFetchSpecificationから呼ばれる。
EOAdaptorChannel.adaptorChannelWillFetchRow
- SELECT文の発行後、結果セットからデータ行を一行取り出す前に呼ばれる。 このデータ行の各列の値が、対応する(オブジェクトの)属性値になる。 このときに対応させる属性を変更したい場合などに使う。
EOAdaptorChannel.adaptorChannelDidChangeResultSet
- fetchRowがnullを返したが、まだデータベースの結果セットが残っている場合に呼ばれる。 setAttributesToFetchを指定することで、再びデータ行をフェッチすることができる。 (fetchRowがnullを返すのに結果セットが残っている場合がどのような状況で発生するのか確認できていません)
EOAdaptorChannel.adaptorChannelDidFetchRow
- データ行のフェッチが成功したときのみ、フェッチ後に呼ばれる。 フェッチしたデータ行の内容を、オブジェクトに変換する前に変更することができる。
EODatabaseContext.databaseContextShouldUpdateCurrentSnapshot
- EOFがフェッチしたオブジェクトのスナップショットをすでに保持していた場合に?EODatabaseChannel.fetchObjectから呼ばれ、スナップショットを更新するかどうかを決める。 このメソッドはEOFがスナップショットを検証する前に呼ばれる。
EODatabaseContext.databaseContextFailedToFetchObject
- リレーションが1対1のフォールトのオブジェクトのフェッチに失敗したときに呼ばれる。 このメソッド中でオブジェクトの情報を補完してからtrueを返すと、EODatabaseContextはその情報を元にスナップショットを作成する。 falseを返すとEODatabaseContextはオブジェクトのグローバルIDを missingObjectGlobalIDs で追跡する。 グローバルIDに該当するオブジェクトがオブジェクトグラフ内にあり、すでに更新済みとして処理されていたら例外を発生する。
EOAdaptorChannel.adaptorChannelDidFinishFetching
- ?EOAdaptorChannelがデータ行をフェッチした後に呼ばれる。
EOEditingContext.editingContextShouldMergeChangesForObject
- 親オブジェクトストア(通常はEOObjectStoreCoordinator)内のオブジェクトの変更を保存する前に、各オブジェクトごとに呼ばれる。 trueを返すと変更が保存され、オブジェクトにマージされる(デフォルトの動作)。 ただし
editingContextShouldInvalidateObject
は呼ばれない。 falseを返すと変更が破棄され、オブジェクトはデータベースと同じ状態に戻される。 このメソッドとeditingContextDidMergeChanges
を使うことで、独自のマージ処理を実装することができる。 EOEditingContext.editingContextDidMergeChanges
- 親オブジェクトストア(通常はEOObjectStoreCoordinator)内のオブジェクトが変更された後(新規にフェッチしたりリフェッチした場合など)、一度だけ呼ばれる。 オブジェクトグラフ内のオブジェクトを独自の方法でマージすることができる。
EODatabaseContext.databaseContextDidFetchObjects
- フェッチ処理がすべて終了した後に呼ばれる。
Inverse Pages: WebObjects基礎研究室