我不知道这是一个非常奇怪的问题。我有要更新的coredata中的实体列表。
CoreDataManager.shared.storeContainer.performBackgroundTask { (context) in
let queueItem = QueItem.getQueWithID(context: context, id: workID!)
//fill in properties
let workItem = WorkItem.getWorkItemWithID(context: context, id: workID!)
//fill in some properties
workItem?.property1 = stuff
workItem?.property2 = stuff2
CoreDataManager.shared.saveContext(context)
ConnectionQue.shared.startQueue()
}
在这一点上,一切都是正确的。我使用DBBrowser for SQLLite在磁盘上看到具有正确值的实体。如果我断点并检查对象本身,那么它们也具有正确的数据。
接下来,应用程序流将尝试使用此数据进行某些连接,如果失败,则仅对workItems进行基本提取以填充屏幕。但是,已更新的特定工作项在我调用以获取本地存储内容的访存中没有更改。但是,我已经对queueItems(它们是新实体,并且同时创建)进行了提取,并且它们确实与更新一起存在。就像保存新项目一样,但没有更新。
这是我在主线程上执行提取操作时的代码,使用主上下文在本地存储器中填充屏幕。
DispatchQueue.main.async {
let request = WorkItem.fetchRequest()
let workItems = CoreDataManager.shared.performFetch(CoreDataManager.shared.mainContext, fetchRequest: request as! NSFetchRequest<NSFetchRequestResult>) as? [WorkItem]
completion(workItems, nil)
}
现在,当我查看返回到workItems的数组时,该实体具有其旧的空数据,而不是先前填充的新数据。 Que项目是正确的。而且,如果我重新启动应用程序然后进行提取,则所有信息都是正确的。
我尝试过专门保存主上下文,但这似乎无济于事。
什么可能导致一个实体在一次获取时不正确,而另一实体在同时被修改时在其获取正确?
编辑:所以我找到了一种解决方案,但不知道它是否正确。由于这似乎是一个缓存问题,并且由于我知道对旧的Objective-c调用refreshAllObjects(),所以我也尝试快速进行此操作,并且它似乎可以正常工作。但这是正确的方法吗?所有更新都需要刷新吗?为什么这不会自动发生?