0

現在、次の形式を使用してダウンロードするために、メソッド内にコードのブロックをディスパッチしています。

dispatch_queue_t downloader("downloader", NULL);
dispatch_async (downloader, ^{

//do stuff

});

私が今やろうとしているのは、そのブロックにUIImageを返してもらい、それをメソッドの戻りとして使用できるようにすることです。

-(UIImage *) myMethod:

dispatch_queue_t downloader("downloader", NULL);
dispatch_async (downloader, ^{

//do stuff to get UIImage

     dispatch_async (dispatch_get_main_queue, ^{

     return UIImage;  //this is the image that image I want myMethod to return

     });    
});

ただし、互換性のないタイプエラーにパラメータを渡すことができます。これは、ブロックに戻り値があることを宣言していないためです。

ブロックがdispatch_async内でUIImageを返すことをどのように宣言できますか?これは可能ですか、それともブロックが実行を終了するまでにメソッドはすでに実行されていますか?

4

1 に答える 1

1

リターンを使用するには、メソッドが同期している必要があるため、その方法で解決策はありません。次のように、関数の一部としてブロックを使用する必要があります。

- (void)myMethodOnFinish:(void(^)(UIImage *))finishBlock {

    dispatch_queue_t downloader("downloader", NULL);
    dispatch_async (downloader, ^{

        //do stuff to get UIImage
        UIImage *result = ...;

         dispatch_async (dispatch_get_main_queue, ^{
         //this is the image that image I want myMethod to return
             finishBlock(result);
        });    
    });
}

次のように呼び出します。

[self myMethodOnFinish:^(UIImage *image) {

    self.imageView.image = image; // or whatever you need to do            

}];
于 2012-11-23T19:55:15.930 に答える