内联块定义 - 如何?

时间:2012-11-23 19:49:16

标签: objective-c xcode io block grand-central-dispatch

现在我在方法中调度一段代码,使用以下格式为我下载内容:

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?这是否可行,或者该方法是否已在块完成执行时完成?

1 个答案:

答案 0 :(得分:1)

好吧,使用return会要求你的方法是同步的,所以没有办法解决这个问题。您将需要使用块作为函数的一部分,如下所示:

- (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            

}];