【问题标题】:How to load UIImageView objects in the background?如何在后台加载 UIImageView 对象?
【发布时间】:2014-02-05 07:21:36
【问题描述】:

在后台加载UIImageView对象是否安全,完成后将它们插入主线程的视图层次结构中?

例如,您创建了一个 GCD 块,它在后台加载 10 个图像视图。最后,您有 async 块,它将所有 UIImageViews 添加到视图层次结构中。

我听说如果您创建一个UIImage 并将其添加到UIImageView,那么当UIImageView 需要它时,图像数据就会按需加载。我将如何强制将UIImage 数据拉到后台,这样它就不会长时间阻塞主线程?

【问题讨论】:

  • 你在下载这些图片吗?他们已经在磁盘上?您是否看到一些性能问题(具体而言)?
  • 尝试Asyncronous image view 而不是uiimageView

标签: ios iphone ipad uiimageview uiimage


【解决方案1】:

如果您从服务器下载图像,最好在单独的线程上下载它们,这样它就不会阻塞您的 UI。图像下载完成后,您可以从主线程将其设置为特定的图像视图。

__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^(void) {
        NSData *imageData= [NSData dataWithContentsOfURL:Image_URL];
        UIImage *image = [UIImage imageWithData:imageData];

        dispatch_sync(dispatch_get_main_queue(), ^(void) {
           __strong __typeof__(weakSelf) strongSelf = weakSelf;
           strongSelf.someImageView.image = image;
            ;
        });
    });

注意: 如果你使用AFNetworking,你可以使用UIImageView类别,它会在后台处理加载图像,也可以缓存它,所以如果你想再次下载,它会从缓存中获取该图像。

【讨论】:

  • GCD块中是否需要使用__weak self??
  • 概念是我们没有创建任何保留周期。创建块时,它将捕获其环境意味着将对其中使用的每个对象创建强引用。所以有机会获得retian cycle,这就是我们使用weakself的原因。还有一种可能性是,如果我们在块中并且没有其他参考,那么我们的弱自我将为零,因为我们在块的一侧创建了强自我。我们还应该在使用它之前检查 nil。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多