RestKit 0.20.0-rc1 - POST 后重复对象

Posted

技术标签:

【中文标题】RestKit 0.20.0-rc1 - POST 后重复对象【英文标题】:RestKit 0.20.0-rc1 - Duplicate object after POST 【发布时间】:2013-02-11 13:00:16 【问题描述】:

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

    用户收藏了一个团队

    新的 favouriteTeam 对象被创建并保存到 Core Data:

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

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

    我遇到的问题是发布的项目,因为它总是被返回,而不是被覆盖(基于标识属性)。返回的其他对象(无论是修改过的还是由其他设备新创建的)都不会被复制……只是用户设备中新创建的设备。

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

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];

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

注意:这个问题也发布在 RestKit Google Groups here.

谢谢!

更新:这种重复似乎不会在团队第一次被收藏时发生。以下任何对团队的收藏尝试都会导致此重复。

【问题讨论】:

你解决过这个问题吗? Yes & No。我最终没有使用 RestKit,而是使用 AFNetworking 手动完成。 我解决了这个问题,将发布答案。 【参考方案1】:

我遇到了类似的问题,虽然我无法真正确认这是否解决了您的问题,但无论如何都会在这里发布我的答案。

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

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

restkit 在后台所做的是获取响应,将其填充到我创建的新对象中,然后将其保存到 coredata 中,而无需事先检查是否有另一个具有相同唯一 ID 的对象。这就是为什么第一个对象创建很好,但随后的对象是重复的。

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

【讨论】:

以上是关于RestKit 0.20.0-rc1 - POST 后重复对象的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.20.0 rc1 - 使用字符串数组创建请求帖子

RestKit 0.20.0-rc1 mappingResult 304 Not Modified后为空

Restkit 0.20.rc 需要但不包含多个 0.10 项

使用 RestKit 在 post 请求中寻求帮助

RESTKit:重用 objectManager 来制作后续的 POST

RestKit 中 POST 中的参数顺序