gpt4 book ai didi

ios - Coredata后台保存、同步策略和冲突解决

转载 作者:行者123 更新时间:2023-11-29 10:26:04 25 4
gpt4 key购买 nike

这更像是一个架构问题,所以我不确定它是否适合这个网站,但我想无论如何我都会试一试。

登录后,我们的一个应用程序会根据本地保存的最新时间戳从服务器获取 Item 更新。因此,任何比最新的本地时间戳更新的记录都会被下载并导入到数据库中。

这一切都发生在使用本地托管对象上下文的后台线程中。

应用程序还从服务器下载 ItemCollection 实例(通过 CMS 创建),这些实例本质上是 Item 实例的集合。

当在后台下载/创建新的 Item 实例时,另一个进程正在从同一服务器获取 ItemCollection 项目。

每个 ItemCollection 都有一个 name 属性和一个作为 Coredata 关系导入的 ItemIDs 数组。

有时 ItemCollection 导入会引用后台进程尚未创建的 ItemUniqueID。在本例中,我们创建了一个占位符 Item,它仅包含其 ItemUniqueID 并被标记为占位符/待处理。

所以在这两个导入之间,很可能会创建重复项。

ItemCollection 导入过程可能会创建一个 ID=1 的 Item,而同一项目可能会在正在下载和处理 Items 的后台线程上创建,我们最终会得到两个引用相同 ID==1Item 实例。

因为这两个处理是同时运行的,在不同的线程中并使用不同的托管对象上下文,所以这些重复对象唯一会意识到彼此的时间是我们在 上调用 save 时主线程中的 managedObjectContext

所以我的问题的 TL;DR 版本是如何确保两个单独的托管对象上下文不会创建/更新/删除 NSManagedObject 重复项,当发生这种情况时,使用一些方法处理它的正确方法是什么某种冲突解决方案?

谢谢,罗格

最佳答案

您正在使用自己的唯一 ID。那挺好的。但是,每个上下文都可以有自己的数据 View ,由于存储尚未更新,因此彼此不知道。这可能会导致错误的读数/解释。

您可以尝试通过观察 NSManagedObjectContextObjectsDidChangeNotification 来管理它,这将使每个上下文都知道另一个上下文在做什么,从而知道何时出现具有相同唯一 ID 的对象。然而,这可能比它值得的更多努力。

为什么必须同时进行下载?

为什么不执行一个下载,完成一个下载后,再执行另一个下载?它使架构更简单,而且越简单越好。您的实现还受益于更少的代码和更少的错误机会。

关于ios - Coredata后台保存、同步策略和冲突解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32219900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com