2

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

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

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

当我使用[acDetail addObject:newDetailData];方法将详细数据记录添加到acDetail阵列控制器时,导入多达72000条记录(大多数文件包含3600到21600条记录)可能需要20分钟以上的时间。一旦这个冗长的过程完成,导入的详细数据字段将填充tvDetail表视图。当我在tvSummary表格视图中进行选择时,显示在tvDetail表格视图中的数据会更改为与所选行相匹配。我认为这是它应该如何工作的。在Cocoa/Objective-C/Core数据学习过程中(我仍然是新手),我发现我可以在大约五秒内将72000条记录复制到maDetail可变数组中。我还发现我可以使用[acDetail setContent:maDetail];方法在大约两秒内将maDetail可变数组的内容复制到acDetail阵列控制器。

我不明白的是如何让acDetail数组控制器记住它在tvSummary表视图中选择不同的行时给出的内容。我看到引用强制数组控制器'保存',但是,我找不到有关如何实现这种方法的任何文档。任何意见或方向将不胜感激。

回答

1

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

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

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

我会解决你对储蓄的关注,但我真的不明白你想要做什么。也许你可以多告诉我们一些,并重申它是一个真正的问题。

+1

谢谢你,让我以不同的方式思考问题,解决方案非常简单。我改变了ObjectDetailData * newDetailData = [[ObjectDetailData alloc] init]; ObjectDetailData * newDetailData = [controllerDetailDataArray newObject];它的作品就像[contollerDetailDataArray addObjects:newDetailData]的魅力; ...雅虎! – SBeckett

2

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

您应该可以直接将新对象添加到核心数据对象图中(只需插入它们),并让控制器自动拾取它们存在的内容。相反,控制器也应该知道删除或更新。

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

+0

使用CoreData比使用AddObjects更好吗? – tofutim