共有マネージャーを使用してRestKitで1回のGETリクエスト中に複数のモデルを更新しようとしています。
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];
where にresponseDescriptor
は、マッピング、キー パス、およびパス パターンがあります。
フェッチされる JSON には 5 つの個別のモデルが含まれており、空のアプリケーションから開始すると、合計 300 個のオブジェクト (さまざまなタイプ) など、かなりのサイズになる可能性があります。一般的な構造を示す編集された例を次に示します。そのように見えますが、アプリにはさらに多くの機能があります。
{
"rooms":[{"id":1,"name":"Hall A"},{"id":2,"name":"Hall B"}],
"sessions":[{"id":168,"title":"Pre-emptive value-added strategy","room_id":1}]
}
あるマッピングではRKConnectonDescription
、CoreData が外部キーに基づいて関連していることを認識できるように使用しようとしています。例えば:
NSRelationshipDescription *roomRelationship = [_sessionMapping.entity relationshipsByName][@"room"];
[_sessionMapping addConnection:[[RKConnectionDescription alloc] initWithRelationship:roomRelationship attributes:@{ @"roomRemoteId": @"remoteId" }]];
すべての CoreData オブジェクトは、json 経由で取得される ID の識別属性として remoteId プロパティを使用します。たとえば、セッション マッピングは次のようになります。
_sessionMapping = [RKEntityMapping mappingForEntityForName:@"Session" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
_sessionMapping.identificationAttributes = @[ @"remoteId" ];
[_sessionMapping addAttributeMappingsFromDictionary:@{
@"id" : @"remoteId",
@"title": @"title",
@"room_id": @"roomRemoteId"}];
部屋のマッピングは次のようになります。
_roomMapping = [RKEntityMapping mappingForEntityForName:@"Room" inManagedObjectStore:[RKObjectManager sharedManager].managedObjectStore];
_roomMapping.identificationAttributes = @[ @"remoteId" ];
[_roomMapping addAttributeMappingsFromDictionary:@{
@"id" : @"remoteId",
@"name": @"name"
}];
私が見つけたのは、空のデータベースから開始してすべてのオブジェクトを取得すると、一部のセッションだけが部屋を持っているということです。セッション モデルにはroomRemoteId
フィールドがあり、ルームにはremoteId
. 部屋のないセッションの 1 つをスポット チェックしたところ、roomRemoteId
セットがありremoteId
、データベースでその部屋を検索できました。
セッションの約 25% は問題ないように見えますが、残りの 75% にはroomRemoteId
ルーム リレーションが設定されていますが、設定されていません。
問題は、一部のセッションが正しくマップされ、他のセッションがマップされないのはなぜでしょうか?