保存核心数据会中断获取请求

时间:2017-06-28 13:18:44

标签: ios swift core-data

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

我从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()
}

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

1 个答案:

答案 0 :(得分:0)

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

func

查看解决类似问题的其他question