概述
实施
DatabaseEngine
didFinishLaunchingWithOptions
中,DatabaseEngine
已实例化DatabaseEngine
包含视图控制器和通知viewDidLoad
中,我将DatabaseEngine
委托设置为视图控制器实例关注(时间问题)
DatabaseEngine
,此时视图控制器的viewDidLoad
将不会被执行,因此{{1} } delegate不会初始化,因此数据库将执行completionHandler但由于委托是nil,因此不会执行任务我采取了哪些措施解决问题
注意 - 我没有明确使用线程,但基于我的理解,completionHandler是异步执行的。
问题
答案 0 :(得分:1)
你的设计有点复杂,但看起来很稳固。 (我更喜欢由应用代表管理核心数据,但如果您愿意,您的方法也一样好。)
但是,我会使用您的DatabaseEngine类的延迟初始化模式。通过这种方式,当它需要并且实际上不存在时,它将创建自己并执行必要的初始化例程,而视图控制器将等待直到对引擎的调用返回某些内容。
// in view controller viewDidLoad, e.g.
self.managedObjectContext = [databaseEngine managedObjectContext];
如果未初始化上下文,则会在此处进行。
答案 1 :(得分:1)
我认为最好的方法是让你的app委托管理数据。似乎是最好的方法,它是默认的CD应用程序模板所做的。
我会研究使用MagicalRecord,如果你问我,这真是太神奇了。使用MagicalRecord,您只需调用[NSManagedObjectContext MR_defaultContext];
即可获得默认上下文。 MR还有像
NSArray *array = [SomeObject findAll]
返回包含所有CD对象的数组。你甚至可以设置谓词等,而且速度非常快。