現在、NSNotificationCenter を使用して応答を送信している静的ライブラリがあります。しかし、デリゲートの方がより良い解決策になると思います。問題は、ヘッダーがまだわからない場合にデリゲート メソッドを呼び出す方法です。ライブラリが使用されているときに、私が担当していないものを実装する方法がわかりません。
では、ユーザーが独自のメソッドを作成し、ライブラリが必要なときにそれらを呼び出すことを許可するメリットはありますか?
現在、NSNotificationCenter を使用して応答を送信している静的ライブラリがあります。しかし、デリゲートの方がより良い解決策になると思います。問題は、ヘッダーがまだわからない場合にデリゲート メソッドを呼び出す方法です。ライブラリが使用されているときに、私が担当していないものを実装する方法がわかりません。
では、ユーザーが独自のメソッドを作成し、ライブラリが必要なときにそれらを呼び出すことを許可するメリットはありますか?
デリゲートは、多くの場合、一連のコールバックを指定するプロトコルを宣言することによって通信されます。
@protocol MONImageGeneratorObserver <NSObject>
@required
// called when an image has been generated
- (void)generatedImageWasSavedToURL:(NSURL *)pURL;
- (void)imageGenerationDidComplete;
@end
次に、API でプロトコルを指定することにより、実装する必要があるインターフェイスをクライアントに伝えることができます。
- (void)setImageGeneratorObserver:(NSObject<MONImageGeneratorObserver>*)pObserver;
これを達成するためのもう 1 つの良い方法は、ブロックであるパラメーターを提供することです。通常、そのブロックを受け取ったらコピーしたいと思うでしょう。そうすれば、クライアントのコードについて何も知る必要はありません。
API は非常に具体的である必要があります。
@interface MONObject : NSObject
+ (void)performAsynchronousLoadWithSuccessfulCallback:(void(^)(void))pSuccess errorCallback:(void(^)(NSError *))pError;
@end
@implementation MONObject
+ (void)performAsynchronousLoadWithSuccessfulCallback:(void(^)(void))pSuccess errorCallback:(void(^)(NSError *))pError
{
if (random()%2) {
// load succeeded!
pSuccess();
}
else {
// load failed = =
NSError * e = ...;
pError(e);
}
}
@end
どちらの場合も、インターフェースを指定するので、実装でそれらのヘッダーを確認する必要はありません。ブロック本体またはコールバックの定義で独自のメソッドを呼び出すことができMONImageGeneratorObserver
ます。