如何将图像设置为在另一个视图控制器中异步获取的 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 和图像视图以获取集合视图的索引路径功能