是否可以在 Scene Delegate for SwiftUI 中为核心数据实体创建获取请求
Is it possible to create a Fetch Request for core data entities within Scene Delegate for SwiftUI
我正在努力使我的核心数据实体与我正在使用的网络服务保持同步。问题是 Web 服务每天都会更新项目,因此我尝试创建一个获取请求以将缓存项目与远程项目进行比较,并在有任何更改、删除或添加时更新缓存项目。
理想情况下,我希望在用户进入应用程序之前完成此操作。所以我试图在我的场景委托中创建一个获取请求。
逻辑是这样的:在应用程序加载时,我从我的 json 网络服务中解析项目。同时,我为现有的本地核心数据实体创建一个获取请求,将本地项目与远程项目进行比较,并在需要时更新缓存的项目。
这可能吗?任何有关如何以及何时执行此操作的建议或意见将不胜感激!
没那么复杂。创建视图时,您已经在 sceneDelegate 中有了上下文。只需执行提取。
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 更新版本。因此,您只需要检查版本 - 如果不同,则需要更新对象。但这只是为了防止用户无法离线修改对象。如果可以的话,一定有一些复杂的碰撞解决逻辑。
我正在努力使我的核心数据实体与我正在使用的网络服务保持同步。问题是 Web 服务每天都会更新项目,因此我尝试创建一个获取请求以将缓存项目与远程项目进行比较,并在有任何更改、删除或添加时更新缓存项目。
理想情况下,我希望在用户进入应用程序之前完成此操作。所以我试图在我的场景委托中创建一个获取请求。
逻辑是这样的:在应用程序加载时,我从我的 json 网络服务中解析项目。同时,我为现有的本地核心数据实体创建一个获取请求,将本地项目与远程项目进行比较,并在需要时更新缓存的项目。
这可能吗?任何有关如何以及何时执行此操作的建议或意见将不胜感激!
没那么复杂。创建视图时,您已经在 sceneDelegate 中有了上下文。只需执行提取。
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 更新版本。因此,您只需要检查版本 - 如果不同,则需要更新对象。但这只是为了防止用户无法离线修改对象。如果可以的话,一定有一些复杂的碰撞解决逻辑。