我有一个feed(UITableView),它通过远程查询数据库来部分加载。该数据库包含1000行,我必须检索。我在每个查询中检索10行。结果主要包含文本,但我也为每行存储图像。所以我首先检索前十行,当用户向下滚动第10行末尾的UITableView时,我再次进行查询以获得接下来的十行。到目前为止,我的nsmutablearray中存储了总共20行。此过程继续,直到我得到170行。然后我在Xcode中遇到内存问题,应用程序崩溃了。所以我想弄清楚如何加载UITableView中的所有1000行而不会崩溃应用程序。
我想在每次新查询完成时删除前10行,这样nsmutablearray总会有10个对象。我在想吗?我这是第一次这样做。
任何帮助表示赞赏。感谢。
答案 0 :(得分:2)
如果您正在加载表格视图,那不是您的工作方式。您在cellForRowAtIndexPath
中按需加载行,并让iOS删除不在视图中的行。当您创建新单元格时,使用dequeueReusableCellWithIdentifier
并仅在该调用返回nil时创建新单元格。
元素将根据需要从您的数据库中检索,因此您一次在主内存中的现有单元格中不会超过15-20。
在某些情况下,您可能有关于要保留在主内存中的单个单元格的数据,但通常每行应该只有几个小对象 - 这不是一个问题,以适应1000元素的NSArray。
你不要保留你创建的所有单元格的数组 - iOS会这样做,然后它会释放那些在屏幕外滑动的单元格,以保存存储空间。
答案 1 :(得分:1)
您是否考虑过将核心数据与NSFetchResultsController一起使用?一起使用它们将帮助您在大多数时间避免任何记忆问题
答案 2 :(得分:0)
我会在数组中保留3页的行。你想要1页前一个和前进。这将加快您的界面。您不希望冒险异步接口等待同步数据库调用。如果没有超级理由,我也不会将图像存储在数据库中。