我正试图将我的核心数据实体与我使用的web服务保持同步。问题是web服务每天都会更新项目,所以我试图创建一个fetch请求来比较缓存的项目和远程项目,如果有任何更改、删除或添加,则更新缓存的项目。
理想情况下,我希望在用户进入应用之前完成这个操作。因此,我试图在我的场景代表中创建一个fetch请求。
其逻辑是这样的。在应用加载时,我从我的json webservice中解析项目。同时,我为现有的本地核心数据实体创建一个fetch请求,将本地项目与远程项目进行比较,并在需要时更新缓存的项目。
这可能吗?如果有任何关于如何和何时这样做的建议或意见,我们将非常感激!
这没有那么复杂。你在创建View的时候,已经在sceneDelegate中有一个上下文。只要执行fetch即可。
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
fetchRequest.sortDescriptors = []
//fetchRequest.predicate = //some filters
let result = try? context.fetch(fetchRequest)//it always returns an array but it may be empty. Fetch may throw if disc is unavailable or some other reasons
//do what you need
let contentView = ContentView().environment(\.managedObjectContext, context)
一般情况下,你可以将UUID作为对象版本存储。一般来说,你可以将UUID作为对象的版本来存储,每次在后台修改对象时,你都可以用新的UUID更新版本。因此,你只需要检查版本--如果版本不同,你需要更新对象。但这只是在用户不能离线修改对象的情况下。如果他能,一定有一些复杂的逻辑来解决碰撞问题。