集合视图单元格在图像调整大小后需要更多时间加载

时间:2014-11-19 05:08:01

标签: ios objective-c iphone uicollectionview

因为我收到了内存警告,因为我有来自服务器的大图像(每个大约10mb)。我调整了所有图像的大小,然后将其填充到集合视图中。我的问题是当我滚动集合视图时它被卡住并花费更多时间加载。我使用以下code.Item.b_imageUrl是服务器的路径。我正在使用NSDictionary。

UIImage * image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:item.b_imageUrl]]];
    CGSize sacleSize = CGSizeMake(100, 100);
    UIGraphicsBeginImageContextWithOptions(sacleSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, sacleSize.width, sacleSize.height)];
    UIImage * resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [cell.imgV_b_image setImage:resizedImage];

另外当我在乐器分配工具中检查时,我的整体字节变得疯狂(700mb-非常大)

如何在没有内存警告的情况下顺畅滚动...?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

理想情况下,您希望服务器为您提供已调整大小的图片,但如果这不可能,我的想法是:

1。重构

您的图像大小调整代码不属于视图控制器。理想情况下,您应该从网络服务下载这些图像,并且可以向网络添加自定义图像大小调整请求(类似于AFNetworking 1.0具有AFImageRequestOperation的方式)。这样,您的控制器需要做的就是询问特定大小的图像,网络服务将对图像操作进行排队并返回调整大小的图像。

2。图像大小调整

我的另一个问题是你要调整图像的大小。它看起来像是在主线程中发生这种情况。唐'吨。下载图像时,您应该将图像大小调整为后台线程,让控制器将流程调度到主线程,以便将图像绑定到图像视图。

3。图像持久性

您还应该将这些图像缓存在设备上的某个位置。必须始终重新下载您已经看过的内容,这是一种糟糕的用户体验。也许在NSCachesDirectory()

内的某个地方

4。后台线程到集合视图

不要忘记在下载图像时,用户可以在集合视图中的任何位置。你应该自己去取消已经滚出屏幕的图像请求或者至少使用LIFO队列,以便最近查看的图像请求获得优先权。因此,当您的图像完成后,您可以查询-[UICollectionView cellForItemAtIndexPath:]以查看该单元格是否仍在屏幕上