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

时间:2012-04-28 13:32:21

标签: ios core-data

概述

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

实施

  • 为名为DatabaseEngine
  • 的数据库活动创建了一个单例类
  • 在appDelegate didFinishLaunchingWithOptions中,DatabaseEngine已实例化
  • DatabaseEngine包含视图控制器和通知
  • 的属性(委托)
  • 在视图控制器的viewDidLoad中,我将DatabaseEngine委托设置为视图控制器实例
  • 打开数据库后,完成处理程序(通过委托属性)调用方法来设置视图控制器和通知

关注(时间问题)

  • 我担心可能会出现(时间问题),首先创建DatabaseEngine,此时视图控制器的viewDidLoad将不会被执行,因此{{1} } delegate不会初始化,因此数据库将执行completionHandler但由于委托是nil,因此不会执行任务

我采取了哪些措施解决问题

  • 在视图控制器的viewDidLoad中,我正在检查数据库是否已启动以及是否未加载视图控制器,如果是,则我再次执行任务(设置视图控制器的视图)。

注意 - 我没有明确使用线程,但基于我的理解,completionHandler是异步执行的。

问题

  1. 我已多次尝试过,视图控制器数据正确加载,似乎没有时间问题。我甚至尝试循环一个大的值(创建一个延迟),但仍然没有时间问题。我想知道为什么?
  2. 我的实施是一个好的设计还是有更好的方法来做到这一点?
  3. 这是解决我问题的正确方法吗?

2 个答案:

答案 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对象的数组。你甚至可以设置谓词等,而且速度非常快。