CoreData NSArrayController addObject:Agonizingly Slow

时间:2011-07-01 01:56:33

标签: objective-c cocoa core-data nsmutablearray nsarraycontroller

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

本质上,我有两个表视图,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数据学习过程中(我仍然是新手)我发现我可以在大约5秒内将72000条记录复制到maDetail可变阵列。我还发现我可以使用[acDetail setContent:maDetail];方法在大约两秒钟内将maDetail可变数组的内容复制到acDetail数组控制器。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

我会解决你对保存的担忧,但我真的不明白你想要做什么。也许你可以告诉我们更多,并将其作为一个实际问题重申。

答案 1 :(得分:2)

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

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

控制器将观察Core Data上下文并自动响应其中的更改。这就是绑定的工作原理以及为什么你可以编写一个几乎没有代码的整个应用程序。