如何将图像设置为在另一个视图控制器中异步获取的 UIImageView?

Posted

技术标签:

【中文标题】如何将图像设置为在另一个视图控制器中异步获取的 UIImageView?【英文标题】:How to set image to UIImageView which is fetching asynchronously in another viewController? 【发布时间】:2015-06-03 10:37:01 【问题描述】:

我对 ios 编程比较陌生。

我有一个NSObject“地点”,如下所示。

@interface Places : NSObject

 @property(strong) NSString *placeName;
 @property(strong) UIImage *placeImage;

@end

我在 UITableView 中列出 Places 对象的数组。在 tableView:cellForRowAtIndexPath: 上,图像正在从 Web url 异步获取。在tableView:didSelectRowAtIndexPath: 上,我将各自的“Places”对象传递给另一个 ViewController (detailViewController)。在那个 detailViewController 中,我使用下面的代码在 UIImageView 中显示图像。

self.imageView.Image = self.myPlaces.placeImage

我的问题是当我传递该对象时,不需要将图像提取到 placeImage。无论如何,在 mainViewController 中连续完成图像获取到 placeImage 时,是否更新 self.imageView

我的代码如下。在mainViewController的tableView:cellForRowAtIndexPath:中调用。

    NSURL *url = [NSURL URLWithString:@"http://imageurl_goes_here"];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^

        NSData *imageData = [NSData dataWithContentsOfURL:url];

        dispatch_async(dispatch_get_main_queue(), ^
            if(imageData != nil)
            
              place.placeImage = [UIImage imageWithData: imageData];
              cell.cellImageView.image = place.placeImage;
            

        );
    );

【问题讨论】:

请提供加载图片的代码。可能有完成处理程序或回调。 @johnpatrickmorgan 请查看编辑后的代码。 你是在图片完全加载之前点击表格行吗? @Rashmi Ranjan mallick 有时,是的。我知道问题所在。但我在问如何在不阻塞用户的情况下纠正它直到异步调用完成 是的。我只是想检查一下问题。仍在寻找解决方案! 【参考方案1】:

嗯,有一些技术可以存档:

您可以在每次收到图像时通知您的第二个视图控制器。例如。在你内心的dispatch_async。但这需要主控制器对第二个控制器有很多了解。 您可以使用Key-Value Observing技术来观察每个地方的图像更新。在这种情况下,您可能还想使用一些方便的库来为您提供理智(例如在对象被释放时取消订阅,否则您会崩溃),例如that one 或其他任何东西。

This post 的 Matt Thompson 可能有助于实例之间的其他类型的通信。

【讨论】:

谢谢。我会检查并返回。

以上是关于如何将图像设置为在另一个视图控制器中异步获取的 UIImageView?的主要内容,如果未能解决你的问题,请参考以下文章

无法从 wikipedia API 恢复图像并将其显示在另一个视图控制器中

在另一个视图控制器中传递 ImagePickerView 的图像

如何在单元格中调用图像 url 和图像视图以获取集合视图的索引路径功能

将 Imageview 设置为在 sdcard 中显示图像?

在另一个视图下动画 UIView

当视图控制器呈现在另一个视图控制器上时如何获取屏幕截图?