【问题标题】:Magical Record / Core Data: Saving Many Objects (~250K) Without Performance / Time Troubles?神奇的记录/核心数据:在没有性能/时间问题的情况下保存许多对象 (~250K)?
【发布时间】:2015-01-03 01:22:57
【问题描述】:

我无法将 (~250k) 单词(它们在数组中)作为对象保存到 Core Data 中。它需要永远。这就是我使用快速枚举所做的事情,一旦我用我所有的话创建了一个数组:

[self learnWord:word andSave:YES];

这会将每个单词保存为一个对象,但需要很长时间(约 30 分钟)。

所以我尝试只创建对象并在快速枚举循环完成后保存一次:

[self learnWord:word andSave:NO];

//Save our suggestions
 [[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreAndWait];

它的作用是检查一个值为“word”的对象是否与我们的词不匹配,并在这种情况下创建一个实体。然后我分配以下值:

wordSuggestion.word = word;
wordSuggestion.popularity = @1;

我尝试过禁用每个单词的 SAVE,而是在快速枚举循环完成后手动保存(这不起作用)。

有没有一种简单的方法可以非常快速地创建对象并在 30 分钟内保存它们?

【问题讨论】:

  • 您是否尝试过在后台线程中通过NSOperationQueue 进行保存,并发操作数不错?
  • 感谢您回复@LouisTur,不太确定如何处理 NSOperationQueue,您可以链接到任何示例吗?我现在一定会查的。
  • 哦,我有点偏离@KingPolygon。我将苹果的Core Data and Concurrency 指南添加为书签,但现在在指南的顶部它说 “自编写本文档以来,Core Data 并发的最佳实践发生了巨大变化;请注意,本章不代表当前的建议” 。所以在恐慌了一分钟后,我发现了这个:Core Data Tuts+。看起来他们有一些非常好的特定于 iOS8 的核心数据信息。我将不得不自己检查一下
  • 谢谢@LouisTur!将def检查出来。欣赏!
  • 我不使用 CoreData,因为我们的应用程序都需要加密,但是使用标准 SQLite,如果您希望在今年完成,您需要在写入一堆数据之前启动事务。

标签: ios objective-c core-data magicalrecord


【解决方案1】:

尝试在移动设备上将 250k 项加载到 Core Data 中可能不是最好的方法,您应该描述为什么尝试这样做并考虑替代方案。

如果您确实采用了这种方法,那么最好提前创建数据库并将其嵌入到发布的应用程序中。然后,如果需要,仅在运行时应用增量更新。这样加载时间就无关紧要了。

30 分钟的加载时间太疯狂了,大概您正在为每个添加的单词发出提取请求(这将是低效的)。相反,您应该将单词分组(例如 100 个,但您需要测试以找到一个好的值)。为每个批次运行一个提取请求,然后创建并保存所需的增量。

一旦你有了这个,你就可以轻松地创建后台线程和相关的上下文,然后当你保存这些上下文时,你可以保存到父持久存储。采用这种方法时,应确保源词表不包含重复项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多