在Restkit执行映射操作之前删除Core数据中的现有对象

时间:2014-07-09 16:26:02

标签: ios core-data restkit

基本上我在这种情况下试图处理孤儿对象。

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

但是,当我的API请求操作失败时,可能会出现这种情况。在这种情况下,我不能丢失本地数据库中的现有对象。因此我考虑使用撤销操作。

现在我尝试使用setWillMapDeserializedResponseBlock执行此操作。 (此块在API操作成功后执行,就在restkit执行映射之前执行)

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

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

这是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];
    }

如何以不同的方式解决此问题?

更新

使用获取请求块是不可行的,因为树中有很多实体,如层次结构。

我的核心数据结构如下:

RootEntity
- identifier

EntityB
- root_identifier

EntityC
- b_identifier

EntityD
- c_identifier

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

另外,我在关系中设置了级联删除。因此,当rootEntity被删除时,所有子项都将被删除。我认为这种删除比制作这些获取请求要便宜。

1 个答案:

答案 0 :(得分:1)

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