必须从CoreData

时间:2017-01-17 00:37:04

标签: ios swift cocoa core-data

在模拟器和我的真实设备上,应用程序终止时会保存一个字符串数组。当我重新启动应用程序和fetchRequest以获取持久化数据时(来自viewDidLoad或手动按钮操作),我在第一次尝试时得到一个空数组。直到第二次fetchRequest,我终于得到了我的数据。

有趣的是,这个问题似乎没有时间差异。在尝试第二次尝试之前,我尝试设置各种超时。我是等待10秒到一分钟 - 甚至是第一次取得之后不是立即无关紧要;数据仅在第二次尝试时获取。

我必须使用此代码来获取我的数据:

        var results = try self.context.fetch(fetchRequest) as! [NSManagedObject]
        while (results.isEmpty) {
            results = try self.context.fetch(fetchRequest) as! [NSManagedObject]
        }
        return results

为了我的理智,这里有一份清单:

注意**我忘了提到我正在建立一个框架。我正在使用CoreData和框架的包标识符并使​​用框架中包含的模型,所以我想避免在框架之外使用逻辑(除了在appDelegate中初始化框架)。

2 个答案:

答案 0 :(得分:2)

核心数据堆栈应该在位于appDelegate.swift的applicationDidFinishLaunchingWithOptions中初始化,因为在您尝试获取数据后添加了psc。

答案 1 :(得分:0)

Apple的样板代码包括:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
    /* ... */
    do {
        try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil)
    } catch {
        fatalError("Error migrating store: \(error)")
    }
}

addPersistentStoreWithType调用完成之前,保存的数据不可用,并且这些数据在不同的队列上异步发生。它会在某个时刻完成,但上面的代码在此之前执行。你所看到的并不奇怪 - 你基本上是循环,直到异步调用结束。

您需要以某种方式延迟提取,直到加载持久性存储。有几种可能性:

  1. 像你正在做的那样做某种。我更愿意查看持久性存储协调器的persistentStores属性,以查看是否已加载任何存储而不是反复尝试获取。
  2. 在加载持久性存储后发布通知,并在通知发生时进行提取。