如何从方法内的块返回变量?

时间:2013-12-07 02:39:30

标签: ios objective-c uiimage afnetworking objective-c-blocks

假设我有这个方法,给定一个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];
}

但它一直给我这个错误:

  

不兼容的块指针类型将'UIImage *(^)(AFHTTPRequestOperation * __ strong,_ 强id)'发送到'void(^)类型的参数(AFHTTPRequestOperation * _strong,__strong id)'< / p>

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

3 个答案:

答案 0 :(得分:1)

您无法从块内返回图像。这是一个异步API,不能以您尝试的方式使用。要么使用阻塞API,要么在下载映像之前阻塞该方法(一个糟糕的解决方案),要么实现对异步API的支持。例如,将完成块传递给getImage方法,并在下载操作的完成块中调用它。在此块中,使用图像执行所需操作。

答案 1 :(得分:0)

setCompletionBlockWithSuccess:中的回调功能块是一个空白区块,您无法更改其返回类型。

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

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

但是,如果您正在处理AFNetworking和图像,则有一些类别方法可以大大简化检索和缓存。

[self.myImage setImagewithURL:URL];

答案 2 :(得分:0)

您正在调用一个带有两个块的异步方法来处理成功和失败。当调用其中一个处理程序时,您的调用方法早已不复存在。认为你可以将数据返回给它是没有任何意义的,因为它已经消失了。

在成功阻止和失败块中,您将说明操作成功或失败时的操作。那里没有人可以归还任何东西。您所做的是在块中添加代码以在正确的位置处理和存储成功的结果,或以正确的方式处理错误。