RestKit 0.20.0-rc1 - POST后重复的对象

时间:2013-02-11 13:00:16

标签: ios objective-c cocoa-touch cocoa restkit

我尝试在我的iOS应用和服务器之间同步给定用户的优惠团队列表时遇到问题。事件流程如下:

  1. 用户最喜欢的团队

  2. 创建新的favouriteTeam对象并将其保存到Core Data:

    NSError *错误; [[self.currentUser managedObjectContext] save:& error]; [[RKManagedObjectStore defaultStore] .persistentStoreManagedObjectContext save:& error];

  3. 将修改后的favouriteTeams数组发布到服务器上,并在其中加上时间戳,并与任何其他已修改或最近添加的(由其他设备)对象一起返回。

  4. 我遇到的问题是POST的项目,因为它总是被返回而是被复制而不是被覆盖(基于identifyAttributes)。返回的任何其他对象(无论是修改的还是由其他设备新创建的)都不会重复...只是用户设备中新创建的设备。

  5. 这是我的请求/响应映射代码:

    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    [objectManager setRequestSerializationMIMEType:RKMIMETypeJSON];
    // POST Request Mapping
    RKObjectMapping *favouriteTeamMapping = [RKObjectMapping requestMapping];
    [favouriteTeamMapping addAttributeMappingsFromArray:@[@"uuid", @"teamName", @"displayOrder"]];
    RKRequestDescriptor *favouriteTeamRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:favouriteTeamMapping objectClass:[FavouriteTeam class] rootKeyPath:@"favouriteTeams"];
    [objectManager addRequestDescriptor:favouriteTeamRequestDescriptor];
    // Response Mapping
    RKEntityMapping *favouriteTeamResponseMapping = [RKEntityMapping mappingForEntityForName:@"FavouriteTeam" inManagedObjectStore:objectManager.managedObjectStore];
    favouriteTeamResponseMapping.identificationAttributes = @[@"uuid"];
    [favouriteTeamResponseMapping addAttributeMappingsFromArray:@[@"uuid", @"teamName", @"displayOrder", @"lastModified"]];
    RKResponseDescriptor *favouriteTeamResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:favouriteTeamResponseMapping pathPattern:@"/api/favouriteteam/" keyPath:@"data.favouriteTeams" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
    [objectManager addResponseDescriptorsFromArray:@[favouriteTeamResponseDescriptor]];
    // POST
    [objectManager postObject:favTeamsArray path:@"/api/favouriteteam/" parameters:nil success:nil failure:nil];
    

    当设置identifyAttributes(favouriteDrug“uuid”属性)时,我似乎无法弄清楚为什么会发生这种重复。核心数据中的对象是相同的(甚至是相同的uuid)。是什么导致了这种行为?

    注意:此问题也发布在RestKit Google网上论坛here.

    谢谢!

    更新:第一次收到某个团队时,似乎不会发生此重复。以下任何一次尝试收集团队都会导致此重复。

1 个答案:

答案 0 :(得分:0)

我有类似的问题,虽然我无法确定这是否解决了您的问题,但无论如何都会在此发布我的答案。

我的问题是第一个对象可以很好地创建,但之后restkit会在coredata中保存重复的对象,所以这听起来像你看到的问题。

我正在通过以下方式调用post来创建对象: *在coredata中创建一个空白对象,并用我需要的任何属性填充它 *使用restkit API对服务器进行调用,并传入新创建的对象

底层的restkit是做出响应,将其填充到我创建的新对象中,并将其保存到coredata中,而不事先检查是否有另一个具有相同唯一ID的对象。这就是为什么第一个对象创建很好,但后续对象是重复的。

我解决它的方法实际上是将原始值作为params传递给restkit post API调用,而nil作为对象传递。在回复中,restkit将首先查看coredata以查看该ID的对象是否存在并合并该对象的更改,或创建一个新对象。