为 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 优化无响应(核心数据)应用程序的主要内容,如果未能解决你的问题,请参考以下文章