使用两个 NSFetchedResultsController 从 CoreData 获取大量数据

Posted

技术标签:

【中文标题】使用两个 NSFetchedResultsController 从 CoreData 获取大量数据【英文标题】:Fetching large number of data from CoreData using two NSFetchedResultsController 【发布时间】:2013-02-15 14:04:49 【问题描述】:

我正在尝试使用 NSFetchedResultsController 从 UITableView 中的 CoreData 获取 10000 条记录,并尝试使其尽可能快(因为请求具有排序描述符,因此获取这么多数据需要更长的时间)。

我正在尝试使用第一个和主要 NSFetchedResultsController(在表的委托方法中使用)从 CoreData 获取 100 条记录,这些记录显示在表上,而在另一个队列中,我在 viewDidAppear 中开始对 auxiliarFRC 上的所有 10000 条记录进行另一次提取.在 AuxFRC 中的提取结束后,我将 AuxFRC 分配给主 FRC,以便传输所有记录并重新加载表。

我的问题是 UITableView 卡在第一个加载的行直到 AuxFRC 结束提取,即使我调度 performFetch,我不明白为什么会发生这种情况,或者如果这种方式是错误的,还有什么其他方法可以使用获取 10000 条记录并在数据更改时保持最新?

【问题讨论】:

使用 NSFetchedResultsController 是获取大量数据的最佳方式。你使用 [request setFetchBatchSize:20] 吗? 20 号只是举例。 是的,我为它们设置了一个批处理大小,第一个设置了 batchLimit 为 100,但这并没有改变任何东西,即使前 100 条记录被加载到表中,它们也被卷曲了直到辅助结束获取... 也许你的谓词很慢。给我们一个你使用的谓词的例子。 【参考方案1】:

我猜问题出在 NSManagedObjectContext - 这不是线程安全的,我对两个提取都使用了同一个。我创建了原始副本的副本,并在第二个上下文中更改了 AuxFRC。这解决了一切。

【讨论】:

【参考方案2】:

诀窍是使用 FRC 的 缓存机制 并协调 异步获取 与显示线程。

全部都在this答案中总结。

【讨论】:

我猜问题出在 NSManagedObjectContext - 这不是线程安全的,我对两个提取都使用了同一个。我刚刚创建了原始副本的副本,并在第二个上下文中更改了 AuxFRC。希望这能解决一切。 如果确实如此,或者帮助您找到解决方案,请不要忘记在系统启用后立即检查上面的答案。

以上是关于使用两个 NSFetchedResultsController 从 CoreData 获取大量数据的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能两次获取相同的数据? NSFetchedResultsController 为空

如何按创建 UITableViewCell 时计算的值对 UITableView 进行排序?

使用两个字段在两个表之间创建关系

使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询

如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表

如何使用两个地图功能和两个获取 url