能否在SwiftUI的Scene Delegate中为核心数据实体创建一个Fetch Request?

问题描述 投票:0回答:1

我正试图将我的核心数据实体与我使用的web服务保持同步。问题是web服务每天都会更新项目,所以我试图创建一个fetch请求来比较缓存的项目和远程项目,如果有任何更改、删除或添加,则更新缓存的项目。

理想情况下,我希望在用户进入应用之前完成这个操作。因此,我试图在我的场景代表中创建一个fetch请求。

其逻辑是这样的。在应用加载时,我从我的json webservice中解析项目。同时,我为现有的本地核心数据实体创建一个fetch请求,将本地项目与远程项目进行比较,并在需要时更新缓存的项目。

这可能吗?如果有任何关于如何和何时这样做的建议或意见,我们将非常感激!

core-data swiftui appdelegate uiscenedelegate
1个回答
1
投票

这没有那么复杂。你在创建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更新版本。因此,你只需要检查版本--如果版本不同,你需要更新对象。但这只是在用户不能离线修改对象的情况下。如果他能,一定有一些复杂的逻辑来解决碰撞问题。

© www.soinside.com 2019 - 2024. All rights reserved.