2010-08-30 22 views
3

大家好,限制NSFetchedResultsController结果,并获得更多的

我现在有一个NSFetchedResultsController设置返回在我的核心数据的数据库表中的所有行。这会填充我的UITableView。麻烦在于,随着行数的增加,这将很快失去控制。

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

感谢您的任何指导,始终

回答

2

这是控制与NSFetchRequest的-setFetchLimit:-setFetchOffSet

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

如果您觉得情况不是这样,请在苹果的bugreporter.apple.com上提出增强请求。

+0

听起来很凌乱......在NSFetchedResultsController中返回多少数据是安全的?也许我可以以某种方式从获取请求中过滤......它可以处理数千行吗?就这样我可以想出一个想法...想象我的行有4-5个属性,包含少量数据......几个字节。 – mootymoots 2010-08-30 21:25:30

+0

我还没有测试过任何具体的东西,这些指标可能对您没有多大意义,因为我们的模型可能会有相似的表现。最好挑选一个数字(任何数字)并对其进行配置。 – 2010-08-30 22:57:51

3

要改变限制数你只需要飞:

访问您NSFetchedResultsController实例的fetchRequest,改变限制,删除旧的缓存,如果有任何与执行新的获取。

代码:

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

添加一个'[self.tableView reloadData]'进行可视化更新。 – samwize 2014-03-29 13:48:38

0

我相信,而不是设置-setFetchLimit和限制你NSFetchRequest(新行,你必须创建一个新的reqeust),设置-fetchBatchSize只能控制多少行将被加载到内存中。说,如果你显示每个视图10个单元格,请将批量大小设置为两倍左右。在您滚动视图时,控制器会自动将新设置加载到内存中。

1

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

另一个更危险的方法是重新创建NSFetchedResultsController,如果可能的话,旧控制器的结果将发生故障,并且您可以从干净的版本开始。真的很粗糙,但它避免了删除缓存。