EODelegateUsage
2007/03/30 (Fri) 22:07:46 JST
デリゲートのセット
デリゲートをセットする方法はクラスによって異なりますが、多くのクラスではsetDelegateもしくはsetDefaultDelegateメソッドでセットできます。 次のクラスのかっこ内がデリゲートをセットするメソッドです。
- Foundation
- NSArray (setOperatorForKey)
- EOAccess
- EOAdaptor (setDefaultDelegate, setDelegate)
- ?EOAdaptorChannel (setDelegate)
- ?EOAdaptorContext (setDefaultDelegate, setDelegate)
- EODatabaseContext (setDelegate)
- ?EOModelGroup (setClassDelegate, setDelegate)
- EOControl
- ?EOClassDescription (setClassDelegate)
- EOEditingContext (setDelegate)
- EOQualifier (setSupportForClass)
- ?EOSortOrdering (setSupportForClass)
多くのデリゲートメソッドは「クラス名.?ClassDelegate」もしくは「クラス名.Delegate」インターフェースとして定義されており、setClassDelegateとsetDelegateでデリゲートするオブジェクトをセットします。 Delegateのメソッドはセットしたインスタンスのみの挙動を変更しますが、?ClassDelegateのメソッドはクラスのインスタンスすべての挙動を変更します。
アダプタ・データベースレベルのデリゲートが用意されているクラス(EOAdaptor, ?EOAdaptorChannel, ?EOAdaptorContext, EODatabaseContext)のうち、EOAdaptorを除くクラスは必要に応じて動的に生成されるので、アプリケーション起動時にデリゲートをセットすることができません。 ただしその代わりにデフォルトデリゲート(defaultDelegate)が用意されており、上記のオブジェクトの生成時にデリゲートをセットしてくれます。 (?EOAdaptorContextのデフォルトデリゲートは?EOAdaptorChannelにもセットされます)
個別にデリゲートをセットする場合は、EODatabaseContextならEOObjectStoreCoordinatorの cooperatingObjectStores や objectStoreForFetchSpecification などでオブジェクトを取得することができます。 このEODatabaseContextをたどると?EOAdaptorChannelにデリゲートもセットできます。
次のコードはEODatabaseContextと?EOAdaptorChannelにデリゲートをセットする例です。
// それぞれのデリゲートするオブジェクト
DatabaseContextDelegate dcd = new DatabaseContextDelegate();
AdaptorChannelDelegate achd = new AdaptorChannelDelegate();
// EODatabaseContextの配列を取得する
Enumeration e =
EOObjectStoreCoordinator.defaultCoordinator()
.cooperatingObjectStores()
.objectEnumerator();
while (e.hasMoreElements()) {
// EODatabaseContextにデリゲートをセット
EODatabaseContext dbCxt = (EODatabaseContext)e.nextElement();
dbCxt.setDelegate(dcd);
// EOAdaptorChannelの配列を取得する
Enumeration e2 =
dbCxt.adaptorContext().channels().objectEnumerator();
while (e2.hasMoreElements()) {
// EOAdaptorChannelにデリゲートをセット
((EOAdaptorChannel)e2.nextElement()).setDelegate(achd);
}
}
Inverse Pages: WebObjects基礎研究室