直接リレーションを使用するのではなく、デリゲートを使用する利点の実例。
ユニバーサル アプリを作成しているとします。iPadViewController
コードに2 つのビュー コントローラーがiPhoneViewController
あり、どちらも Web サービスからデータを取得する必要があります。したがって、Web サービス呼び出し用のクラスを作成しますwebServiceDownloaderClass
。
webServiceDownloaderClass
ここで、両方のビュー コントローラーに、が終了したときに通知する必要があります。
ここでのオプション...
オプション 1 強い結合
あなたの中iPadViewController
でメソッドを定義します- (void)webServiceDidGetArray:(NSArray *)array;
。そしてiPhoneViewController
、同じメソッドを定義します。
がこれらのwebServiceDownloaderClass
メソッドを呼び出すには、各コントローラーへの参照が必要です...
@property (nonatomic, strong) IPadViewController *iPadController;
@property (nonatomic, strong) IPhoneViewController *iPhoneController;
そして、それが終了したら、どちらを呼び出すかを決定する必要があります...
if (iPadController) {
[iPadController webServiceDidGetArray];
}
etc....
ここでの短所は、View Controller が Web サービス クラスが終了したときに何をするかを定義するようなものであることです。また、別のコントローラーを追加すると、別のプロパティがあり、参照したコントローラーが実際に呼び出しようとしているメソッドを持っているという実際の保証はありません。
オプション 2 委任
we サービス クラスで、プロトコルを定義します。
@protocol WebServiceDownloaderDelegate <NSObject>
- (void)webServiceDidGetArray:(NSArray *)array
@end
そして代議員…
@property (nonatomic, weak) id <WebServiceDownloaderDelegate> delegate;
ここで、Web サービス クラスで Web サービス クラスのアクションを定義しています。また、デリゲートになりたいクラスへの参照が 1 つだけ必要です。また、どのクラスもデリゲートになることができます。これで、iPad と iPhone の両方のコントローラーがデリゲートになり、プロトコルに準拠することで、必要なメソッドを実装することを Web サービス クラスに "約束" することができます- (void)webServiceDidGetArray:(NSArray *)array;
。
もちろん、これはデリゲートが役立つ 1 つのケースにすぎません。
委任ではなく直接的な関係を使用する必要がある場合もあります。