假设我有这个方法,给定一个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>
我对块很新,所以也许我完全倒退了。我最好如何实现这样的方法?
答案 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)
您正在调用一个带有两个块的异步方法来处理成功和失败。当调用其中一个处理程序时,您的调用方法早已不复存在。认为你可以将数据返回给它是没有任何意义的,因为它已经消失了。
在成功阻止和失败块中,您将说明操作成功或失败时的操作。那里没有人可以归还任何东西。您所做的是在块中添加代码以在正确的位置处理和存储成功的结果,或以正确的方式处理错误。