iOS - 核心数据 - 完成处理程序

Posted

技术标签:

【中文标题】iOS - 核心数据 - 完成处理程序【英文标题】:iOS - Core data - completion handler 【发布时间】:2012-04-28 13:32:20 【问题描述】:

概述

我有一个使用核心数据的 ios 项目 核心数据被视图控制器和通知使用

实施

为名为@9​​87654321@ 的数据库活动创建了一个单例类 在appDelegatedidFinishLaunchingWithOptionsDatabaseEngine被实例化 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 - 核心数据 - 完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

如何最好地处理核心数据+ iOS的状态恢复?

如何将“C++ 完成处理程序”传递给 NSURLSessionDataTask 以处理它返回的数据?

错误处理、持久化容器、通知 IOS

iOS Swift 如何访问在完成处理程序闭包中创建的数据——在闭包之外

程序员取悦女朋友的正确姿势---Tips(iOS美容篇)

iOS 核心数据轻量级迁移