ios - 在Restkit进行映射操作之前删除Core data中已有的对象

标签 ios core-data restkit

在这种情况下,基本上我正在尝试处理孤立对象。

我的核心数据存储中有一些现有对象。在执行 API 请求操作之前,我删除了该特定实体的所有对象。因此,当我从服务器获取新对象时,我的本地数据与从服务器接收到的新数据对象同步。

但也有可能是我的 API 请求操作失败。在这种情况下,我无法承受丢失本地数据库中现有对象的后果。因此,我考虑为此使用撤消操作。

现在我尝试使用 setWillMapDeserializedResponseBlock 来执行此操作。 (此 block 在 API 操作成功后且恰好在 restkit 执行映射之前执行)

所以在这个 block 中,我执行实体中现有对象的删除。

但是在映射完成后,服务器响应中丢失但在本地存储中存在的对象仍然存在。 (因此从本地存储中删除现有对象不会影响存储)。在 setWillMapDeserializedResponseBlock 中显式调用 saveToPersistantStore 方法后,更改不会得到反射(reflect)。

这是setWillMapDeserializedResponseBlock:

    {
    // start undo grouping
    [[[NSManagedObjectContext MR_defaultContext] undoManager] beginUndoGrouping];
    [[[NSManagedObjectContext MR_defaultContext] undoManager] setActionName:@"undo deleting objects"];

    // perform deletion of objects
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"..."];
    [Entity MR_deleteAllMatchingPredicate:predicate];

    // end undo grouping
    [[[NSManagedObjectContext MR_defaultContext] undoManager] endUndoGrouping];
    }

我怎样才能以不同的方式解决这个问题?

更新:

使用 fetch 请求 block 是不可行的,因为在树状层次结构中有很多实体。

我的核心数据结构如下:

RootEntity
- identifier

EntityB
- root_identifier

EntityC
- b_identifier

EntityD
- c_identifier

api 调用的参数是 RootEntity 的标识符。 我得到了响应中的所有实体。可以为 RootEntityEntityB 轻松编写 FetchRequests,因为它们具有用于存储 RootEntity 标识符的属性。但是对于 EntityCEntityD,与 RootEntity 没有直接关系,这使得编写获取请求变得困难。

另外,我在关系中设置了级联删除。因此,当 rootEntity 被删除时,所有子实体都会被删除。我认为这种删除比发出那些获取请求的成本更低。

最佳答案

您应该改为使用 fetch request block它由 RestKit 在成功时执行(不是失败,请注意你的响应描述符,因为它们指示成功是什么)并删除所有与获取匹配但在刚刚收到的响应中不是新的。

关于ios - 在Restkit进行映射操作之前删除Core data中已有的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24659044/

相关文章:

swift - 如何在 Swift 中创建一个 managedObjectContext 实例

cocoa - NSArrayController 返回 null

objective-c - 为什么我不能在 super 上调用核心数据访问器?

ios - 为什么我会因 dispatch_once 而陷入僵局?

iphone - 动画 imageview 第一次需要时间

objective-c - Restkit在附加图像时将子对象数组序列化为字符串

ios - RestKit 托管对象未更新的问题

iphone - 从 iOS 发布到 Rails 应用程序时序列化嵌套对象

ios - 如何在 xcode 中将 ARC 启用 .a 文件添加到非 ARC 项目

c++ - 为什么我的 CFRunLoopTimer 没有触发?