Coredata背景保存,同步策略和冲突解决

时间:2015-08-26 06:58:30

标签: ios multithreading core-data

这更像是一个架构问题,所以我不确定它是否适合这个网站,但我想我还是试一试。

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

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

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

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

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

有时,ItemCollection导入会引用尚未由后台进程创建的ItemUniqueID。在这种情况下,我们创建一个仅包含其Item的占位符ItemUniqueID,并将其标记为placehoder / pending处理。

因此,在这两个导入之间,创建重复项的可能性很高。

ItemCollection导入过程可能会创建一个ID为1的Item,同时可以在从服务器下载和处理Items的后台线程上创建相同的项目,并且我们最终会引用两个引用相同Item的{​​{1}}个实例。

由于这两个处理是并发运行的,在单独的线程中并使用单独的托管对象上下文,因此这些重复对象彼此之间唯一的联系就是我们在ID==1上调用save时主线。

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

谢谢, ROG

2 个答案:

答案 0 :(得分:1)

我真的不太喜欢你的解决方案:(。你对服务器做的两个调用/线程非常依赖于彼此,从我的观点来看,事情应该保持简单。有什么意义。使用两个线程,数据是“紧密耦合”吗?

当您检索ItemsCollection时,您是否可以同时检索项目数据? (我的意思是在同一个服务器上调用)。这将是一个完美的解决方案(带有ItemCollection和Items的JSON / XML),你将避免很多麻烦。

如何确定每个ItemCollection中的项目(或将在)CoreData存储中?这些是你必须要处理的问题。

如果您无法同时获取所有信息,我会暂时将ItemCollection数据存储在结构中,直到保存第一个调用中的所有项目。

此致 天使

答案 1 :(得分:1)

您正在使用自己独特的ID。这很好。但是,每个上下文都可以拥有自己的数据视图,另一个未知,因为商店尚未更新。这可能会导致错误的读数/解释。

您可以尝试通过观看NSManagedObjectContextObjectsDidChangeNotification来管理这一点,这将允许每个上下文知道对方正在做什么,从而知道具有相同唯一ID的对象何时出现。但是,这可能比它的价值更多。

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

为什么不执行一次下载,当完成下载后,执行其他下载?它使架构更简单,越简单越好。您的实现也可以从更少的代码和更少的错误机会中受益。