如何从方法内的块返回variables?

说我有这个方法给定一个URL返回一个UIImage:

- (void)getUIImageFromURL:(NSURL *)URL { NSURLRequest *request = [NSURLRequest requestWithURL:URL]; AFHTTPRequestOperation *imageOperation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; imageOperation.responseSerializer = [AFImageResponseSerializer serializer]; [imageOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { return (UIImage *)responseObject; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; [imageOperation start]; } 

但它一直给我这个错误:

向' void(^)(AFHTTPRequestOperation * _strong,__strong id)'参数发送'UIImage *(^)(AFHTTPRequestOperation * __ strong,_ strong id)'的不兼容块​​指针types

我有点新的块,所以也许我完全倒退了。 如何最好的实现这样的方法?

您不能从块内返回图像。 这是一个asynchronousAPI,不能以您尝试的方式使用。 要么使用阻塞的API,其中的方法阻塞,直到下载图像(一个不好的解决scheme),或者实现对asynchronousAPI的支持。 例如,将一个完成块传递给getImage方法,并在下载操作的完成块中调用它。 在这个块中,用图像做你需要的。

setCompletionBlockWithSuccess:的callback块是一个void块,你不能改变它的返回types。

在你的情况下,你可能会在你的块内设置图像,而不是返回一个图像。

 [imageOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { self.myImage.image = [UIImage imageWithData:responseObject]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { }]; 

但是,如果你正在处理AFNetworking和图像,有类别的方法,应该大大简化检索和caching。

 [self.myImage setImagewithURL:URL]; 

您正在调用两个块的asynchronous方法来处理成功和失败。 当这些处理程序中的一个被调用的时候,你的调用方法已经消失了。 认为你可以返回数据是没有意义的,因为它已经消失了。

在成功块和失败块中,指示操作成功或失败时要执行的操作。 没有人在那里返回任何东西。 你所做的是在块中添加代码来处理和存储成功的结果在正确的地方,或以正确的方式处理错误。