objective-c - CoreData NSArrayController addObject : Agonizingly Slow

标签 objective-c cocoa core-data nsmutablearray nsarraycontroller

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

本质上,我有两个 TableView ,tvSummary 和 tvDetail;两个数组 Controller ,acSummary 和 acDetail;和一个可变数组 maDetail。

导入文件时,我使用 [acSummary addObject:newSummaryData]; 方法将摘要数据记录添加到 acSummary 数组 Controller 。文件导入后,摘要数据字段将填充 tvSummary TableView 。

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

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

我不明白的是如何让 acDetail 数组 Controller 记住当我在 tvSummary TableView 中选择不同的行时给出的内容。我看到有关强制数组 Controller “保存”的引用资料,但是,我找不到任何有关如何实现此类方法的文档。任何建议或指导将不胜感激。

最佳答案

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

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

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

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

关于objective-c - CoreData NSArrayController addObject : Agonizingly Slow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6542888/

相关文章:

ios - 按下后更改后退按钮标题

objective-c - 核心数据故障和内存警告

database - 如何使用带有插入/删除的核心数据(或 SQL)维护有序表?

ios - 如何从 NSDate 中删除时区偏移量

ios - iPhone/iPad 上 UIActivityIndi​​cator 下的阴影

objective-c - NSURLSessionDownloadTask - 下载但以错误结束

objective-c - 共享跨进程数据对象

objective-c - 有没有办法移动 NSTextView 的指示器?

objective-c - NSMutableArray 可见性/保留问题

ios - 是否可以保存对照片库中照片存储位置的引用,而不是将实际的 UIImage 本身保存为数据?