CoreData NSArrayController addObject:非常慢

Posted

技术标签:

【中文标题】CoreData NSArrayController addObject:非常慢【英文标题】:CoreData NSArrayController addObject: Agonizingly Slow 【发布时间】:2011-07-01 01:56:32 【问题描述】:

我有一个从 *.xml 文件导入信息的 CoreData 应用程序。该文件有两个部分,摘要和详细信息。

本质上,我有两个表视图,tvSummary 和 tvDetail;两个数组控制器,acSummary 和 acDetail;和一个可变数组 maDetail。

我在导入文件时使用[acSummary addObject:newSummaryData]; 方法将汇总数据记录添加到acSummary 数组控制器。导入文件后,汇总数据字段将填充 tvSummary 表视图。

当我使用[acDetail addObject:newDetailData]; 方法将详细数据记录添加到 acDetail 数组控制器时,最多可能需要 20 分钟才能导入多达 72000 条记录(大多数文件包含 3600 到 21600 条记录)。一旦这个冗长的过程完成,导入的详细数据字段将填充 tvDetail 表视图。当我在 tvSummary 表视图中进行选择时,tvDetail 表视图中显示的数据会更改以匹配所选行。我认为这就是它应该的工作方式。

在学习 Cocoa / Objective-c / Core Data 的过程中(我还是个新手)我发现我可以在大约 5 秒内将 72000 条记录复制到 maDetail 可变数组中。我还发现我可以使用[acDetail setContent:maDetail]; 方法在大约两秒钟内将 maDetail 可变数组的内容复制到 acDetail 数组控制器。

我想不通的是,当我在 tvSummary 表视图中选择不同的行时,如何让 acDetail 数组控制器记住它给出的内容。我看到对强制数组控制器“保存”的引用,但是,我找不到任何关于如何实现这种方法的文档。任何建议或指导将不胜感激。

【问题讨论】:

【参考方案1】:

NSArrayController,正如该类的文档告诉我们的那样,“一个管理对象集合的绑定兼容类”。 Cocoa 绑定就像一个自动控制器,在模型和视图对象之间同步数据 - 每次您修改绑定的属性时,所有绑定到该属性的对象都会收到通知,并会根据需要自行更新。

如果您通过 NSArrayController 一次将 72,000 个对象添加到可变数组,则可能会发送大量不必要的通知,并执行大量无用的更新。有几种方法可以解决这个问题,但我建议先尝试最简单的方法...

不是单独添加每条记录,而是将所有记录添加到单独的可变数组中。完成后,使用 NSArrayController 的 -addObjects: 方法一次将所有对象添加到托管数组中。这应该会通知观察者该数组已更改一次,而不是每个对象更改一次,我认为您会看到性能的显着提高。

我会解决您对储蓄的担忧,但我真的不明白您要做什么。或许您可以告诉我们更多信息,并将其作为一个实际问题重述。

【讨论】:

谢谢,你让我对这个问题有了不同的看法,解决方案也很简单。我改变了 ObjectDetailData *newDetailData = [[ObjectDetailData alloc] init];到 ObjectDetailData *newDetailData = [controllerDetailDataArray newObject];它就像 [contollerDetailDataArray addObjects:newDetailData];... Yahoo!!!【参考方案2】:

我不确定我是否理解您的设置,但在我看来,您没有正确使用 Core Data 的阵列控制器。如果您使用 Core Data,则不必直接将对象添加到控制器。

您应该能够将新对象直接添加到 Core Data 对象图中(只需插入它们)并让控制器自动拾取它们的存在。相反,控制器也应该知道删除或更新。

控制器将观察核心数据上下文并自动响应其中的变化。这就是绑定的工作原理,以及为什么您可以编写几乎没有代码的整个应用程序。

【讨论】:

以上是关于CoreData NSArrayController addObject:非常慢的主要内容,如果未能解决你的问题,请参考以下文章

CoreData(iOS):是不是需要创建数据库才能使用CoreData?coredata可以对简单的平面文件进行操作吗? [关闭]

CoreData 本地数据存储

CoreData与CloudKit同步时将图像保存到CoreData?

RestKit + CoreData:从CoreData缓存中排除某些对象

Coredata — 入门使用

认识CoreData—初识CoreData