如何在后台线程中从 NSFetchedResultsController 加载大数据

Posted

技术标签:

【中文标题】如何在后台线程中从 NSFetchedResultsController 加载大数据【英文标题】:How to load large data from NSFetchResultController in background thread 【发布时间】:2015-03-11 06:40:36 【问题描述】:

我正在使用NSFetchResultController 显示来自核心数据的UICollectionView 中的数据。 UICollectionViewCell 包含表格视图。所以简而言之,UITableView 中显示了非常大量的数据。我也在显示NSFetchResultController 以在该表视图中显示数据。 现在的问题是当我滚动UICollectionView 时,它会从数据库加载数据以显示在UITableView 中。由于数据量很大,所以UICollectionView 的滚动非常不稳定。任何帮助 我虽然我应该将获取请求移动到后台线程,但它开始崩溃应用程序并给出期望

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSSetM: 0x15722f80> was mutated while being enumerated.'

【问题讨论】:

我建议根据您当前的描述,您有许多问题需要解决。我是否正确理解您在每个集合视图中都嵌入了UITableView?如果是这种情况,我建议您控制 FRC 为每个表视图获取的数据量,也许是表视图空间中可以显示的数据量的两倍?然后为每个集合视图安装一个触发器,当点击/选择该触发器时,会对该表视图的所有数据执行另一次提取。另外,我建议您阅读有关如何执行有效提取的信息 - Marcus S Zarra 的核心数据,第二版 您的错误与您无法在枚举期间改变/更改NSMutableSet 的事实有关。 【参考方案1】:

我认为@andrew 是对的,问题出在您的数组中,请确保您的数组或用于此目的的任何 datalist 控件必须是可变的,只要是可变的,它就会解决您的问题。

请参阅下面的答案,就像您提出的问题一样。

Collection was mutated while being enumerated error in objective C

【讨论】:

以上是关于如何在后台线程中从 NSFetchedResultsController 加载大数据的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用“进度”GUI在后台线程中从网络加载数据? [复制]

CoreData 是不是可以在另一个上下文/后台任务中从一个上下文/线程安全地使用 NSManagedObject

如何在android Q os中从后台服务启动活动,而不从开发人员选项的设置中单击“允许后台活动启动”?

在后台线程中删除文件

在objective-c中,后台线程中的重复方法是不是正确?

如何在 iOS 中从 AppDelegate 调用视图控制器