0

概述

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

执行

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

关注(时间问题)

  • 我担心可能存在这样的场景(时间问题),其中DatabaseEngine首先创建了视图控制器,此时viewDidLoad不会执行视图控制器,因此DatabaseEngine不会初始化委托,因此数据库将执行完成处理程序,但由于委托是无,不会完成任何任务

我做了什么来解决这个问题

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

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

问题

  1. 试了几次,视图控制器数据加载正确,似乎没有计时问题。我什至尝试循环遍历一个大值(以产生延迟),但仍然没有时间问题。我想知道为什么 ?
  2. 我的实现是一个好的设计还是有更好的方法来做到这一点?
  3. 这是解决我的担忧的正确方法吗?
4

2 回答 2

1

我认为最好的方法也是让您的应用程序委托管理数据。似乎是最好的方法,这是默认 CD 应用程序模板所做的。

我会考虑使用 MagicalRecord,如果你问我,这真是太棒了。使用 MagicalRecord,您只需调用即可[NSManagedObjectContext MR_defaultContext];获得默认上下文。MR 也有很棒的免费类方法,比如

NSArray *array = [SomeObject findAll]

它返回一个包含所有 CD 对象的数组。您甚至可以设置谓词等,而且速度非常快。

于 2012-04-28T17:34:56.567 回答
1

你的设计有点复杂,但看起来很扎实。(我更喜欢由应用程序委托管理核心数据,但如果您愿意,您的方法也一样好。)

但是,我会使用通常的数据库引擎类延迟初始化模式。这样,当它被需要但实际上不存在时,它将创建自己并执行必要的初始化例程,而视图控制器将等待直到对引擎的调用返回一些东西。

// in view controller viewDidLoad, e.g.
self.managedObjectContext = [databaseEngine managedObjectContext];

如果上下文没有初始化,就会发生在这里。

于 2012-04-28T16:59:57.997 回答