【问题标题】:How do I return a variable from a block inside a method?如何从方法内的块中返回变量?
【发布时间】:2013-12-07 02:39:29
【问题描述】:

假设我有一个给定 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, _strong id)”发送到“void (^)(AFHTTPRequestOperation *_strong, __strong id)”类型的参数

我对积木有点陌生,所以也许我完全倒退了。我将如何最好地实现这样的方法?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • @AaronBrager 是的,我知道。我的意思是他不能将块中的值返回给外部函数的调用者。
    • 如果他试图这样做我会更加困惑......因为外部函数也返回void
    【解决方案2】:

    setCompletionBlockWithSuccess:中的回调块是一个void块,你不能改变它的返回类型。

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

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

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

    [self.myImage setImagewithURL:URL];
    

    【讨论】:

    • 在你的回答中,self.image 应该是self.myImage(类别在 UIImageView,而不是 UIImage)。
    • @AaronBrager 仿代码 ;)。 self.image 本来是一个 UIImageView。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2016-02-01
      • 2014-10-27
      • 2019-12-03
      • 1970-01-01
      相关资源
      最近更新 更多