因为我收到了内存警告,因为我有来自服务器的大图像(每个大约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-非常大)
如何在没有内存警告的情况下顺畅滚动...?谢谢你的帮助。
答案 0 :(得分:1)
理想情况下,您希望服务器为您提供已调整大小的图片,但如果这不可能,我的想法是:
您的图像大小调整代码不属于视图控制器。理想情况下,您应该从网络服务下载这些图像,并且可以向网络添加自定义图像大小调整请求(类似于AFNetworking 1.0具有AFImageRequestOperation的方式)。这样,您的控制器需要做的就是询问特定大小的图像,网络服务将对图像操作进行排队并返回调整大小的图像。
我的另一个问题是你要调整图像的大小。它看起来像是在主线程中发生这种情况。唐'吨。下载图像时,您应该将图像大小调整为后台线程,让控制器将流程调度到主线程,以便将图像绑定到图像视图。
您还应该将这些图像缓存在设备上的某个位置。必须始终重新下载您已经看过的内容,这是一种糟糕的用户体验。也许在NSCachesDirectory()
不要忘记在下载图像时,用户可以在集合视图中的任何位置。你应该自己去取消已经滚出屏幕的图像请求或者至少使用LIFO队列,以便最近查看的图像请求获得优先权。因此,当您的图像完成后,您可以查询-[UICollectionView cellForItemAtIndexPath:]
以查看该单元格是否仍在屏幕上