在后台线程中初始化Core Data堆栈是一个很好的设计选择吗?

时间:2011-03-20 23:39:42

标签: iphone design-patterns core-data

熟悉Stackoverflow用户,

我正在尝试优化我的iphone应用程序启动时间(即在应用程序打开后尽快显示第一个视图)。我想要优化的部分是应用程序委托中的Core Data堆栈(托管对象上下文,持久性存储协调器等等)的初始化。我想到了解决这个问题的两种方法,并想知道你对这些解决方案(或其他你可能有的)有什么想法(优点/缺点)?

注意:核心数据堆栈已在应用程序代理中初始化,原因在于Where to place the "Core Data Stack" in a Cocoa/Cocoa Touch application

解决方案1(我的首选):

在应用程序委托的后台线程中初始化Core Data Stack。这将允许应用程序初始化更快,并且窗口/视图可以更快地显示。

解决方案2:

当视图控制器需要访问核心数据堆栈时,Lazy实例化核心数据堆栈。我喜欢这个想法,但是,核心数据栈应该在应用程序委托中初始化,然后在每个需要它的视图控制器中传递。

注意:此解决方案违反了在应用程序委托中初始化Core Data Stack的约定。

此致

1 个答案:

答案 0 :(得分:2)

如果您查看使用模板的标准Core Data,您将看到在某个视图控制器调用app delegate的managedObjectContext之前,不会初始化堆栈。因此,在需要加载managedObjectContext并开始自行配置的视图之后,Core Data堆栈才会初始化。

堆栈的实际初始化非常轻量且快速。在您开始主动生成对象图并读取和写入持久性存储之前,Core Data并没有做太多工作。简单地初始化堆栈需要非常非常少的时间。

有时候我有类似的担忧并做了一些测试。我发现启动时的真正滞后是加载第一个视图,无论它是否使用了核心数据。我无法衡量启用Core Data和禁用Core Data之间的启动时间差异。

所以,我不打扰非标准的初始化,除非你自己的自定义测试显示它会导致一些性能下降。