1

特定のユーザーのお気に入りのチームのリストを iOS アプリとサーバーの間で同期しようとしているときに、問題が発生しました。イベントの流れは次のとおりです。

  1. ユーザーがチームをお気に入りに追加

  2. 新しい favouriteTeam オブジェクトが作成され、Core Data に保存されます。

    NSError *エラー; [[self.currentUser managedObjectContext] 保存:&エラー]; [[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext 保存:&エラー];

  3. 変更された favouriteTeams の配列はサーバーに POST され、そこでタイムスタンプが付けられ、その他の変更されたオブジェクトまたは (別のデバイスによって) 最近追加されたオブジェクトと共に返されます。

  4. 私が直面している問題は、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 グループにも投稿されています。

ありがとう!

更新:チームが最初にお気に入りに登録されたときには、この重複は発生しないようです。次のいずれかのチームをお気に入りに登録しようとすると、この重複が発生します。

4

1 に答える 1

0

私は同様の問題を抱えていました.これがあなたの問題に対処したかどうかは本当に確認できませんが、とにかくここに私の答えを投稿します.

私の問題は、最初のオブジェクトが正常に作成されることでしたが、その後、restkit はコアデータに重複したオブジェクトを保存するため、これはあなたが見ている問題のように聞こえます。

オブジェクトを作成するための post 呼び出しを次のように行っていました。

レストキットが内部で行うことは、応答を取得し、作成した新しいオブジェクトに入力し、同じ一意の ID を持つ別のオブジェクトがあるかどうかを事前に確認せずにコアデータに保存することです。これが、最初のオブジェクトの作成には問題がなかったのに、後続のオブジェクトが重複していた理由です。

私がそれを解決した方法は、実際には生の値をパラメーターとしてレストキットのポスト API 呼び出しに渡し、nil をオブジェクトとして渡すことでした。応答では、restkit は最初に coredata を調べて、その ID のオブジェクトが存在するかどうかを確認し、変更をそのオブジェクトとマージするか、新しいオブジェクトを作成します。

于 2013-11-13T17:58:38.433 に答える