0

我正在尝试将我的核心数据实体与我正在使用的网络服务保持同步。问题是 Web 服务每天都会更新项目,因此我尝试创建一个获取请求以将缓存项目与远程项目进行比较,并在有任何更改、删除或添加时更新缓存项目。

理想情况下,我希望在用户进入应用程序之前完成此操作。所以我试图在我的场景委托中创建一个获取请求。

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

这可能吗?任何有关如何以及何时执行此操作的建议或建议将不胜感激!

4

1 回答 1

1

没那么复杂。创建视图时,您已经在 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 更新版本。因此,您只需要检查版本 - 如果不同,您需要更新对象。但它仅在用户无法离线修改对象的情况下。如果可以的话,一定有一些复杂的碰撞解决逻辑。

于 2020-05-13T20:08:10.703 回答