1

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

  1. 用户收藏了一个团队

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

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

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

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

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

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 上。

谢谢!

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

4

1 回答 1

0

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

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

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

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

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

于 2013-11-13T17:58:38.433 回答