【发布时间】:2026-02-13 22:40:01
【问题描述】:
我正在使用 NSSqliteStoreType 的核心数据将数据存储在我的 iOS 应用程序中。 我需要将大量对象存储到数据库中。 为了提高核心数据的性能,我考虑了很多因素,例如:
- 批量保存
- 仅在 for 循环结束后保存
- 清除上下文以管理内存
但是保存 100k 个对象需要花费大量时间。请建议我在保存大量数据的同时提高核心数据性能的最佳做法。
【问题讨论】:
我正在使用 NSSqliteStoreType 的核心数据将数据存储在我的 iOS 应用程序中。 我需要将大量对象存储到数据库中。 为了提高核心数据的性能,我考虑了很多因素,例如:
但是保存 100k 个对象需要花费大量时间。请建议我在保存大量数据的同时提高核心数据性能的最佳做法。
【问题讨论】:
[managedObjectContext save],具体取决于对象大小和图形复杂性。详情请见this answer
@autoreleasepool 块中,并在保存后在退出自动释放块之前重置上下文。见this answer
【讨论】:
save(在主线程上进行调用)并在那里传输数据时,使其成为子上下文会阻塞主线程。这意味着要真正将数据刷新到磁盘,您必须在主上下文上调用save,它将在主线程上运行。然后重置它将意味着您的应用程序数据将从内存中卸载......简而言之,它确实有所作为。而且它也不是更多的代码,只需将协调器设置为上下文即可。
您应该考虑在发布应用时预先填充数据,以避免大部分导入开销。假设数据足够静态(大多数数据是),您可以将所有数据预加载到发送应用程序的时间点,然后当应用程序启动时,它只需要从发货日期向前(或上次刷新日期)获取数据向前)。
正如 Leonid Usov 所说,您还应该在后台上下文中进行导入并批量保存到磁盘。这将有助于降低内存并提高 UI 性能。但是在数据的最后,大量数据的导入是密集型的,应该尽量通过预加载来避免。
【讨论】: