我对iOS开发很陌生,而且我对Core Data抓取请求有些问题。我正在使用Xcode 9-beta和swift 4。
每当我更新数据库时,我都会使用获取请求加载新数据,进行一些计算并填充表格视图。
我的挑战是,每次我对实体进行获取请求时,我都会获得相同的数据,即使它已更改。在我看来,它正在重复使用先前获取请求中的数据,因为如果我关闭应用程序并再次打开它,它会向我显示新存储的数据。
这是我的代码:
if let context = container?.viewContext {
context.perform {
let request: NSFetchRequest<EntityName> = EntityName.fetchRequest()
let data = try? context.fetch(request)
self.data = data!
self.setUI()
}
}
我从以下地方获取容器:
let container: NSPersistentContainer? = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer
我提供了一些通用名称,因为我认为这个问题无关紧要。
有什么想法吗?
谢谢, JL
答案 0 :(得分:0)
如果您没有收到任何错误。也许是因为在改变之后你没有保存上下文
你确定那样做了吗?
此方法可帮助您在更改后立即保存上下文
private func saveContext() {
guard managedObjectContext.hasChanges else {
return
}
do {
try managedObjectContext.save()
} catch {
abort()
}
}
尝试在AppDelegate
更新:
也可能是因为.perform
是异步的,在更新数据后,它还没有保存。
异步执行上下文队列中的块。 封装自动释放池和对processPendingChanges的调用
答案 1 :(得分:0)
我从容器中获取了viewContext,因为我需要UI线程。我想那是我的问题。我解决了它通过我用来获取和创建数据并将请求分派给主队列的上下文:
func loadData(with context: NSManagedObjectContext) {
context.perform {
DispatchQueue.main.async {
let request: NSFetchRequest<EntityName> = EntityName.fetchRequest()
let data = try? context.fetch(request)
self.data = data!
self.setUI()
}
}
}
我希望它有所帮助。