使用两个 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 构建左连接查询