オブジェクトXはイメージをダウンロードする必要があります。それはイメージのURLを持っています(ネットワークのファイルかもしれません)。私はURLを取ってimageDataを得ることができる共通のimageHandlerクラスを持っています。私はダウンロードしたイメージで何をするかをカスタマイズするために完了ブロックを取ることができるように、このメソッドを必要とします。Objective-C:メソッド実行の結果を使用するメソッドに完了ブロックを与える方法
私はデリゲートパターンを使用する方法に精通しています。たとえば、
@protocol ImageHandler: NSObject
-(void) getImageFromURL:(NSURL *)url forDelegate:(id <ImageRequestor>)delegate;
@end
@protocol ImageRequestor: NSObject
-(void) image:(UIImage *) image RetrievedForURL:(NSURL *)url withError:(NSError *)error;
@end
したがって、基本的にobjectXクラスのgetImageFromURL:デリゲートをselfとしてデリゲートするメソッドです。 ImageRequestorプロトコルに準拠しています。
ImageHandlerオブジェクトは、マッピングを委譲するためのURLをハッシュテーブルに格納します。それが完了すると、delegateのimage:RetrievedForURL:withError:を呼び出します。そして、この方法で私はイメージとエラーに作用します。
「取得した画像で何をしたいか」をコードの一部として渡すコンプリートブロックを使用して、同じ効果を達成する方法を教えてください。
次のようなアプローチがあります。しかし、ImageHandlerメソッドの実装では、特定の引数で補完を呼び出す必要があるようです。それはこれを実装するための受け入れられた方法ですか(つまり、完了ハンドラは正しい引数で呼び出すメソッドを受け取るメソッドに依存します)。
@protocol ImageHandler: NSObject
-(void) getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock;
@end
getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock
の実装は、はい、何を示してきたが、これを行うための一般的な方法である
getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock
{
//Get UIImage from URL, store it UIIMage ObjectX
//if error happens, store it in NSError objectY, else it is nil
//call completion handler
completionBlock(<UIIMage objectX>,<NSError objectY>);
}