iOS - 核心数据 - 完成处理程序
Posted
技术标签:
【中文标题】iOS - 核心数据 - 完成处理程序【英文标题】:iOS - Core data - completion handler 【发布时间】:2012-04-28 13:32:20 【问题描述】:概述
我有一个使用核心数据的 ios 项目 核心数据被视图控制器和通知使用实施
为名为@987654321@ 的数据库活动创建了一个单例类 在appDelegatedidFinishLaunchingWithOptions
,DatabaseEngine
被实例化
DatabaseEngine
包含视图控制器和通知的属性(委托)
在视图控制器的viewDidLoad
中,我将DatabaseEngine
委托设置为视图控制器实例
打开数据库后,完成处理程序(通过委托属性)调用方法来设置视图控制器和通知
关注(时间问题)
我担心可能存在以下情况(时间问题),首先创建DatabaseEngine
,此时视图控制器的viewDidLoad
不会被执行,因此DatabaseEngine
委托不会被初始化,因此数据库将执行完成处理程序,但由于委托为 nil,因此不会执行任何任务
我为解决问题所做的工作
在视图控制器的 viewDidLoad 中,我正在检查数据库是否已启动以及是否未加载视图控制器,如果是,则我再次执行任务(设置视图控制器的视图)。注意-我没有明确使用线程,但根据我的理解,completionHandler 是异步执行的。
问题
-
我试了几次,视图控制器数据加载正确,似乎没有计时问题。我什至尝试循环遍历一个大值(以产生延迟),但仍然没有时间问题。我想知道为什么?
我的实现是一个好的设计还是有更好的方法来做到这一点?
这是解决我问题的正确方法吗?
【问题讨论】:
【参考方案1】:你的设计有点复杂,但看起来很扎实。 (我更喜欢由应用委托管理核心数据,但如果您愿意,您的方法也一样好。)
不过,我会使用通常的数据库引擎类延迟初始化模式。这样,当它被需要但实际上不存在时,它将创建自己并执行必要的初始化例程,而视图控制器将等待直到对引擎的调用返回一些东西。
// in view controller viewDidLoad, e.g.
self.managedObjectContext = [databaseEngine managedObjectContext];
如果上下文没有初始化,就会发生在这里。
【讨论】:
非常感谢!!在 managedObjectContext 的访问器中进行惰性实例化是个好主意!【参考方案2】:我认为最好的方法也是让您的应用委托管理数据。似乎是最好的方法,这是默认 CD 应用程序模板所做的。
我会考虑使用 MagicalRecord,如果你问我,这真是太棒了。使用 MagicalRecord,您只需调用 [NSManagedObjectContext MR_defaultContext];
即可获得默认上下文。 MR 也有很棒的免费类方法,比如
NSArray *array = [SomeObject findAll]
它返回一个包含所有 CD 对象的数组。您甚至可以设置谓词等,而且速度非常快。
【讨论】:
抱歉,CD 只是 Core Data 的缩写。以上是关于iOS - 核心数据 - 完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章
如何将“C++ 完成处理程序”传递给 NSURLSessionDataTask 以处理它返回的数据?