为 OSX 优化无响应(核心数据)应用程序

Posted

技术标签:

【中文标题】为 OSX 优化无响应(核心数据)应用程序【英文标题】:Optimizing unresponsive (Core Data) app for OSX 【发布时间】:2012-05-31 10:10:12 【问题描述】:

在使用非常无响应 (OSX) 的应用时遇到实际问题。当使用大约 3K(核心数据)对象时,应用在启动和保存以及添加新的托管对象时会冻结。

当我使用 (Instruments) Time Profiler 深入研究调用树时,大部分时间似乎都花在对数组控制器进行排序上。在启动过程中,一半的时间用于 NSUndoManager,它会在数组控制器设置其内容时观察通知...

在实例化新的托管对象时数组控制器是否排序?我需要暂停排序吗? NSUndoManager 会不会是罪魁祸首?

更重要的是,如何分析这样的事情?很可能我正在进行某种指数排序,我的意思是当一个数组控制器自行排序时,其他几个数组控制器也可能不必要地开始重新排序。

我使用的数据模型相当广泛。此外,我在 2 个 .xib 文件中有大约 30 个数组控制器,其中一些管理相同的类类型。

Marcus Zarra's book 关于 Core Data 的内容非常丰富,尤其是关于优化 Core Data 的章节。

此外,Matt Gallagher 的 this article 也令人印象深刻,尽管我遇到的问题可能与需要优化的代码无关。

欢迎任何和所有提示,我在这里拉头发。你能指点我一些可以帮助我的教程或书籍吗?谢谢。

【问题讨论】:

您需要撤消管理器吗?您可以随时将其设置为 nil 并查看它是否有所改进。 . . 好主意。我检查了undo architecture docs,但我不清楚在启动期间的哪个时间点我应该这样做。 我在应用委托的 init 和 awakeFromNib 中都将托管对象上下文的 NSUndoManager 设置为 nil。两种情况都没有真正的改善。 Time Profiler 不再显示 NSUndoManager 参与其中。 好吧,反正这是一个很长的镜头:)对不起! 【参考方案1】:

如果 undoManager 占用了一半的时间,但您在删除 undo manager 时没有发现性能提升,我会说您应该将 IO 视为您的潜在瓶颈。

查看花费在 I/O 操作上的时间。

另外,当涉及到核心数据时,我会在后台线程中完成所有工作。让它挂起你的用户界面是没有意义的。希望您能够使用父/子 MOC,因为这大大简化了处理多个上下文的过程。

即使没有,也值得额外的工作让它在一个单独的线程中工作。你的用户界面会感谢你的。

【讨论】:

对,让我做一些关于使用线程等的研究。我会尽快回复您,不过可能需要一段时间。

以上是关于为 OSX 优化无响应(核心数据)应用程序的主要内容,如果未能解决你的问题,请参考以下文章

同步核心数据:iOS 到 OSX,反之亦然

在 iOS 和 OS X 之间共享 iCloud 核心数据

Mac OSX应用程序:与NSArrayController相关的问题NSTableView核心数据添加记录

MySQL优化核心理论与实践

Mac OSX 上数据库文件的位置

为啥电脑总是显示这个,软件程序总是无响应