简短说明
目前我有一个UITableView,其中包含来自网站的视频单元格。另外,每个单元(表示视频)具有特定的缩略图图像。这些图像是使用NSURLConnection异步下载的(因此我不必担心自己的线程)。当这些图像对象下载后,它们只需通知UITableView刷新它所属的单元格。
我的问题
作为标准,每次通话都会向UITableView提取10个新视频。这意味着允许用户按下UITableView底部的单元格以请求10个新视频,依此类推。这里的问题是很快会有大量的内存使用,因为无论如何,所有缩略图(在UITableView中)的数据仍然存在。
是否有一种智能方法可以取消分配当前不在视图中的图像对象?
此外,UITableView只是直接从我从网站上获取的所有视频对象的数组中直接渲染其所有单元格。这意味着用户可以请求新视频的次数没有限制,这使得该阵列始终变得越来越大。将这些类型的数组始终保存在内存中是否正确?或者你应该删除那些离开视图并稍后再次请求它们的那些?
提前谢谢
答案 0 :(得分:1)
如果你正在使用标准方法对tableview中的单元格进行排队和排队,那么你真的应该只使用一些单元格视图(及其相关的缩略图) - 例如,单元格视图的总数allocate不应该超过屏幕上可见的最大数量,并且通过扩展,缩略图像的分配/引用数量不应超过单元格的总数。每次呈现代表新电影的行时,图像视图都可能重新使用,而不是新视频。
您要考虑的是您的数据阵列(您下载的剪辑的数组,其中可能包含无限的对象)与您的tableview的单元格数组完全分离,这将是一个相对较小的数字。
我的建议是设想图像的下载缓存。基本上,在下载缩略图时,为每个缩略图分配一个唯一的字符串ID,并将实际的图像文件写入磁盘。将唯一ID字符串分配给模型对象。当您的tableview准备呈现图像时,使用id字符串找到单元格的图像,从磁盘加载图像,并填充图像视图。只要您不保留图像,当图像呈现在屏幕外时,图像应该被释放。您还可以在内存不足的情况下清空已加载图像的缓存。
答案 1 :(得分:0)
如果您创建自己的类VideoTableViewCell作为UITableViewCell的子类,并且您为单元格赋予图像属性,则一旦单元格离开屏幕,该图像将被释放。一旦Cell回到视图上,就会重新创建单元格和图像。
对于视频,我会将所有下载的视频文件存储在文档文件夹中,并将其存储在数组中。如果单元格可见或单击,只需从硬盘驱动器加载文件。