【问题标题】:Saving Core Data breaks fetch request保存核心数据中断获取请求
【发布时间】:2017-06-28 13:18:43
【问题描述】:

我对 CoreData 有一个奇怪的问题。当我第一次加载数据时,一切似乎都正常,但在保存数据后,所有后续的 fetch 请求都停止工作(或者更确切地说返回空)。

我从 this 项目复制了 CoreDataStack,这是 udacity 的一个示例项目。它包含一个保存辅助函数。

func save() {
        context.performAndWait() {
            if self.context.hasChanges {
                do {
                    try self.context.save()
                } catch {
                    fatalError("Error while saving main context: \(error)")
                }
                // now we save in the background
                self.persistingContext.perform() {
                    do {
                        try self.persistingContext.save()
                    } catch {
                        fatalError("Error while saving persisting context: \(error)")
                    }
                }
            }
        }
    }

在我的视图控制器内部,我可以使用如下代码为不同的谓词正常运行获取请求。

fetchedResultsController?.fetchRequest.predicate = NSPredicate(format: "fromDatetime >= %@ AND fromDatetime < %@", argumentArray: [selectionTime, selectionTime + 3600_000])
fetchedResultsController?.managedObjectContext.refreshAllObjects()
let m = fetchedResultsController?.fetchedObjects as! [Measurement]
print("number of elements in m: \(m.count)")

使用测试按钮保存数据后。

@IBAction func testAction(_ sender: Any) {
    // test action
    print("test clicked")
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let stack = delegate.stack
    stack.save()
}

所有后续的获取请求都是空的。我还创建了另一个 ViewController,它实现了UITableViewController,包含存储在设备上的所有数据。如果我打开它,数据仍然在那里正确显示,即使在保存之后也是如此。 什么可能导致这种行为?

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    这可能是由于 performAndWait() 导致的死锁导致 UI 线程阻塞的结果,因为它在不同的队列中运行并且并非全部共享同一个公共队列。要解决此问题,请为 managedObjectContext 设置实例变量并始终引用此上下文以避免阻塞对 managedObjectContext 的访问。

     lazy var mainContext: NSManagedObjectContext = {
    let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate
    return appDelegate!.managedObjectContext
     }
    

    查看解决类似问题的另一个question。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 2019-11-06
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多