core-data - 是否可以在 SwiftUI 的 Scene Delegate 中为核心数据实体创建 Fetch Request
问题描述
我正在尝试将我的核心数据实体与我正在使用的网络服务保持同步。问题是 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 更新版本。因此,您只需要检查版本 - 如果不同,您需要更新对象。但它仅在用户无法离线修改对象的情况下。如果可以的话,一定有一些复杂的碰撞解决逻辑。
推荐阅读
- typescript - RxJs `sample` 操作符多次
- flutter - Flutter Native Admobs 大小?
- visual-studio-code - 任务中的 VS CODE SaveAll
- java - 使用 Java 缩放图像
- angular - NX 插件 JetBrains 自定义集合
- php - XAMPP - 更改端口后建立数据库连接时出错
- javascript - 使用正则表达式进行掩蔽处理
- c# - 在使用 specflow 进行测试期间更改 autofac DI 中的注册类
- php - Woocommerce PHP LINE_ITEM_ID
- android - Android - 来回时防止WebView重新加载