我对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,其中包含存储在设备上的所有数据。如果我打开它,即使在保存之后,数据仍会在那里正确显示。
什么可能导致这种行为?
答案 0 :(得分:0)
这可能是由performAndWait()导致的死锁的结果,因为它在不同的队列中运行而不是所有共享同一个公共队列,因此阻塞了UI线程。要解决此问题,请为managedObjectContext设置实例变量,并始终引用此上下文以避免阻止对managedObjectContext的访问。
func
查看解决类似问题的其他question。