0

オブジェクト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>); 
} 

答えて

4

のように見えます。 AppleのAPIを見て、彼らが同じように動作することを確認してください。例えば、その宣言です-[NSURLSession dataTaskWithURL:completionHandler:]、:

- (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url 
         completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler; 
0

があなたのImageRequestor.hファイル内に以下の記述:ほとんど行わ

#import <Foundation/Foundation.h> 

// Here you define your custom response block with the desired parameters 
// That in this case are UIImage and NSError 
typedef void (^ResponseBlock)(UIImage *image, NSError *error); 

@interface ImageRequestor : NSObject 

// Here you define the method that use your custom response block 
- (void)getImageFromURL:(NSURL *)url withCompletionHandler:(ResponseBlock)completionBlock; 

@end 

を、今あなたのImageRequestor.mファイルを開き、追加以下:

#import "ImageRequestor.h" 

@implementation ImageRequestor 

- (void)getImageFromURL:(NSURL *)url withCompletionHandler:(ResponseBlock)completionBlock { 
    // Do all your stuff to get the image and the error 
    // And set them into your completion block 
    // if there is no error that should be nil 

    // completionBlock(YourFetchedImage, YourFetchedError); 
    // completionBlock(nil, YourFetchedError); 
    completionBlock(YourFetchedImage, nil); 
} 

@end 

最後に、t彼:

ImageRequestor *imageRequestor = [[ImageRequestor alloc] init]; 
[imageRequestor getImageFromURL:yourURL withCompletionHandler:^(UIImage *image, NSError *error) { 
    // Your implementation in here 
}]; 

を詰め込むのこの種のは、シングルトンクラスに多くの方法で良く見えます:]

それは、 幸運をお役に立てば幸いです!

関連する問題