特定のユーザーのお気に入りのチームのリストを iOS アプリとサーバーの間で同期しようとしているときに、問題が発生しました。イベントの流れは次のとおりです。
ユーザーがチームをお気に入りに追加
新しい favouriteTeam オブジェクトが作成され、Core Data に保存されます。
NSError *エラー; [[self.currentUser managedObjectContext] 保存:&エラー]; [[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext 保存:&エラー];
変更された favouriteTeams の配列はサーバーに POST され、そこでタイムスタンプが付けられ、その他の変更されたオブジェクトまたは (別のデバイスによって) 最近追加されたオブジェクトと共に返されます。
私が直面している問題は、POST されたアイテムが常に返されるため、(identificationAttributes に基づいて) 上書きされるのではなく複製されていることです。返された他のオブジェクト (変更されたか、別のデバイスによって新しく作成されたかどうか) は複製されません... ユーザーのデバイスから新しく作成されたデバイスだけです。
これが私のリクエスト/レスポンスマッピングコードです:
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];
identityAttributes (favouriteDrug "uuid" 属性) が設定されているときに、この重複が発生する理由がわかりません。Core Data 内のオブジェクトは同一です (同じ uuid であっても)。この動作の原因は何ですか?
注:この質問は、こちらの RestKit Google グループにも投稿されています。
ありがとう!
更新:チームが最初にお気に入りに登録されたときには、この重複は発生しないようです。次のいずれかのチームをお気に入りに登録しようとすると、この重複が発生します。