1

現在、NSNotificationCenter を使用して応答を送信している静的ライブラリがあります。しかし、デリゲートの方がより良い解決策になると思います。問題は、ヘッダーがまだわからない場合にデリゲート メソッドを呼び出す方法です。ライブラリが使用されているときに、私が担当していないものを実装する方法がわかりません。

では、ユーザーが独自のメソッドを作成し、ライブラリが必要なときにそれらを呼び出すことを許可するメリットはありますか?

4

1 に答える 1

0

デリゲートは、多くの場合、一連のコールバックを指定するプロトコルを宣言することによって通信されます。

@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ます。

于 2013-07-15T12:18:41.553 に答える