繁体   English   中英

必须从CoreData调用两次提取

[英]Having to call fetch twice from CoreData

在模拟器和我的真实设备上,在应用终止时都会保存一串字符串。 当我重新启动应用程序并为我的持久数据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中初始化框架)。

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

苹果公司提供的样板代码包括:

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. 加载持久性存储后发布通知,并在发生通知时进行获取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM