限制NSFetchedResultsController结果,并获得更多

时间:2010-08-30 20:05:29

标签: iphone uitableview nsfetchedresultscontroller

全部好,

我目前有一个NSFetchedResultsController设置来返回核心数据库中表中的所有行。这会填满我的UITableView。麻烦的是,随着行数的增加,这将很快失控。

如何将初始查询限制为20个结果,然后在某个地方添加一个按钮以从我们离开的地方“获取更多”?

感谢您提供任何指导

4 个答案:

答案 0 :(得分:3)

这是由NSFetchRequest的-setFetchLimit:-setFetchOffSet控制的。

如果我没记错的话,NSFetchedResultsController的缺点是在创建NSFetchedResultsController实例后无法修改获取请求。我相信这意味着每次更改要检索/显示的范围时,您都必须创建一个新的(具有新的获取请求的实例)。

如果你觉得不应该这样,请在bugreporter.apple.com向Apple提交增强请求。

答案 1 :(得分:3)

要动态更改限制数量,您只需:

访问NSFetchedResultsController实例的fetchRequest,更改限制,删除旧缓存(如果有)并执行新的提取。

代码:

[yourFetchedResultsController.fetchRequest setFetchLimit:50];
[NSFetchedResultsController deleteCacheWithName:"you cache name"];
[yourFetchedResultsController performFetch:nil];

答案 2 :(得分:1)

fetchBatchSize仅影响一次提取的对象数。它不会同时限制内存中的对象数量,因此仍然可能耗尽内存。可以使用batchSize,fetchLimit和offset的组合来限制总并发对象,但是它需要删除缓存或每个“页面”存储单独的缓存,这对我来说似乎不太理想。

另一个更糟糕的方法是重新创建NSFetchedResultsController,如果可能的话,旧控制器的结果将出现故障,你可以从一个干净的平板开始。真的很粗糙,但它避免删除缓存。

答案 3 :(得分:0)

我认为不是设置 -setFetchLimit 并限制你的NSFetchRequest(对于新行,你必须创建一个新的请求),设置 -fetchBatchSize 只控制多少行将被加载到内存中。说,如果每个视图显示10个单元格,请将批处理大小设置为两倍左右。当您滚动视图时,控制器将自动将新设置加载到内存中。