这更像是一个架构问题,所以我不确定它是否适合这个网站,但我想我还是试一试。
登录后,我们的某个应用会根据本地保存的最新时间戳从服务器获取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
答案 0 :(得分:1)
我真的不太喜欢你的解决方案:(。你对服务器做的两个调用/线程非常依赖于彼此,从我的观点来看,事情应该保持简单。有什么意义。使用两个线程,数据是“紧密耦合”吗?
当您检索ItemsCollection时,您是否可以同时检索项目数据? (我的意思是在同一个服务器上调用)。这将是一个完美的解决方案(带有ItemCollection和Items的JSON / XML),你将避免很多麻烦。
如何确定每个ItemCollection中的项目(或将在)CoreData存储中?这些是你必须要处理的问题。
如果您无法同时获取所有信息,我会暂时将ItemCollection数据存储在结构中,直到保存第一个调用中的所有项目。
此致 天使
答案 1 :(得分:1)
您正在使用自己独特的ID。这很好。但是,每个上下文都可以拥有自己的数据视图,另一个未知,因为商店尚未更新。这可能会导致错误的读数/解释。
您可以尝试通过观看NSManagedObjectContextObjectsDidChangeNotification
来管理这一点,这将允许每个上下文知道对方正在做什么,从而知道具有相同唯一ID的对象何时出现。但是,这可能比它的价值更多。
为什么你必须同时进行下载?
为什么不执行一次下载,当完成下载后,执行其他下载?它使架构更简单,越简单越好。您的实现也可以从更少的代码和更少的错误机会中受益。