无论当前上下文状态如何,如何获取NSManagedObject的持久存储副本

时间:2014-01-21 02:24:27

标签: ios core-data nsmanagedobject nsmanagedobjectcontext

我正在开发一个使用CoreData和服务器API的应用程序。 我简化了一点,但棘手的部分是,当我更新关系(添加或删除关系中的对象)时,除了将其保存到CD之外,我还需要向服务器发送单独的HTTP请求以添加或删除这样的对象。

例如(我显然正在跳过JSON< - > CD解析方面),说我:

  1. 从服务器对象O检索关系R(to-many)最初持有另一个对象r0。因此,在获取服务器后,我的主要上下文保持O.R = [r0]
  2. 然后我删除r0并添加r1。现在主要上下文保持O.R = [r1]
  3. 目前,当我想将其提交回应用程序中的支持SQL并且服务器在私有GCD队列上调度异步块时,我会这样做。块:

    1. 创建仅与主要上下文共享商店协调员的临时上下文。
    2. 使用临时上下文O检索对象ObjectID的“已保存”(在SQL db中)版本。
    3. 主要上下文中ObjectID版本中的元素与通过临时上下文检索的版本之间的差异O。通过这种方式,我可以看出刚刚通过临时上下文检索的版本为O.R = [r0],而主要上下文中的当前版本为O.R = [r1]
    4. 根据以上所述,我知道我必须发出一个电话,要求从服务器删除r0,另一个要添加r1
    5. 最后,我保存了主要上下文,因为就CoreData而言,O.R = [r1]确实是新状态。 (请记住,确定删除的内容以及基于每个对象添加的内容仅对服务器更新有用。)
    6. 现在的问题是,我希望使用子上下文和-perfromBlock:来实现这一点。但是,如果我创建主上下文的子上下文而不是仅与主上下文共享存储协调器的临时上下文,我似乎无法找到一种方法来访问相关对象的“旧”版本。 SQL。也就是说,在更改之后,主要上下文具有O.R = [r1]。如果我通过id通过子上下文获取相同的对象,我也得到O.R = [r1]。此外,我尝试在子上下文中调用-refreshObject:以查看是否会强制子进程从SQL重新获取,但它仍然反映了主上下文的当前状态。我认为这与我不知道如何清除的缓存有关。

      重点是,有没有办法强制子上下文从持久存储而不是缓存中获取?或者是否有其他方法来获取相关对象的“旧”状态?

      顺便说一句,-changedValues-changedValuesForCurrentEvents似乎都没有。

1 个答案:

答案 0 :(得分:0)

无法强制孩子获得保存状态而不是当前状态。

您需要在修改对象之前获取对象,或者需要单独的兄弟对象。另一种选择是拥有一个完全独立的堆栈,包括PSC。

更新

兄弟姐妹是两个从同一个NSPersistentStoreCoordinator或同一个父语境延伸的语境。

事先取出。创建子上下文,获取将在子项中修改的对象。然后修改父对象。不会修改子项,因为上下文更改不会被推下。

这是一个黑客。核心数据的设计并非如此。 CD首先是一个对象图,它很难保持所有内容同步。我会重新思考你在做什么,找到一个更清洁的解决方案。

更新

没有关于iCloud如何在内部工作的文档。但是,如果我要编写它,我会听取NSManagedObjectContextDidSave通知,然后根据插入,更新和删除集合构建事务日志。