我在尝试在我的 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 上。
谢谢!
更新:似乎这种重复不会在第一次被收藏时发生。以下任何对团队的收藏尝试都会导致此重复。