我尝试在我的iOS应用和服务器之间同步给定用户的优惠团队列表时遇到问题。事件流程如下:
用户最喜欢的团队
创建新的favouriteTeam对象并将其保存到Core Data:
NSError *错误; [[self.currentUser managedObjectContext] save:& error]; [[RKManagedObjectStore defaultStore] .persistentStoreManagedObjectContext save:& error];
将修改后的favouriteTeams数组发布到服务器上,并在其中加上时间戳,并与任何其他已修改或最近添加的(由其他设备)对象一起返回。
我遇到的问题是POST的项目,因为它总是被返回而是被复制而不是被覆盖(基于identifyAttributes)。返回的任何其他对象(无论是修改的还是由其他设备新创建的)都不会重复...只是用户设备中新创建的设备。
这是我的请求/响应映射代码:
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.
谢谢!
更新:第一次收到某个团队时,似乎不会发生此重复。以下任何一次尝试收集团队都会导致此重复。
答案 0 :(得分:0)
我有类似的问题,虽然我无法确定这是否解决了您的问题,但无论如何都会在此发布我的答案。
我的问题是第一个对象可以很好地创建,但之后restkit会在coredata中保存重复的对象,所以这听起来像你看到的问题。
我正在通过以下方式调用post来创建对象: *在coredata中创建一个空白对象,并用我需要的任何属性填充它 *使用restkit API对服务器进行调用,并传入新创建的对象
底层的restkit是做出响应,将其填充到我创建的新对象中,并将其保存到coredata中,而不事先检查是否有另一个具有相同唯一ID的对象。这就是为什么第一个对象创建很好,但后续对象是重复的。
我解决它的方法实际上是将原始值作为params传递给restkit post API调用,而nil作为对象传递。在回复中,restkit将首先查看coredata以查看该ID的对象是否存在并合并该对象的更改,或创建一个新对象。