RESTKit の学習。
ステップ 1: Twitter サンプル プロジェクトを正常に実行できました。
ステップ 2: 独自の REST Web サービスを指すように Twitter プロジェクトを正常に変更しました... REST は結果を正常に解釈し、作成したカスタム オブジェクトにマップすることができます。
ステップ 3: 独自のプロジェクト スペースを作成し、ステップ 2 の作業コードをコピーしてこのプロジェクトにいくつかの小さな編集を加えましたが、奇妙なことに、RESTKit は結果を適切にマッピングできません。この時点で私は夢中になります。
RESTKit に含まれる便利なデバッグ トレースを有効にすると、両方のプロジェクトが次のようになります。
2012-08-12 21:06:14.145 RKTwitter[9087:13003] D restkit.object_mapping:RKObjectMapper.m:320 Performing object mapping sourceObject
しかし、Step2 Project は次のメッセージとしてこれを取得します。
2012-08-12 21:06:14.294 RKTwitter[9087:13003] T restkit.object_mapping:RKObjectMapper.m:278 Examining keyPath '' for mappable content...
2012-08-12 21:06:14.301 RKTwitter[9087:13003] D restkit.object_mapping:RKObjectMapper.m:261 Found mappable collection at keyPath ''...
一方、私の Step3 プロジェクトはあきらめて死ぬ:
2012-08-12 21:10:40.912 DogPark[9127:13203] D restkit.object_mapping:RKObjectMapper.m:351 The following operations are in the queue: ()
袖をまくり上げて、RESTKit 内でコード実行の違いが発生する正確なポイントを特定しました。
の 160 行目はRKObjectMappingProvider.m
次のメソッドです。
- (id)valueForContext:(RKObjectMappingProviderContext)context {
NSNumber *contextNumber = [NSNumber numberWithInteger:context];
return [mappingContexts objectForKey:contextNumber];
}
Step2 では要素が 1 つ含まれる辞書が返されますが、Step3 プロジェクトでは要素が 0 つ含まれる辞書が返されます。このディクショナリはRKObjectMapper.m
の 332 行目で使用されます。ここで、foundMappable は Step2 プロジェクトに対して true であるか、Step3 プロジェクトに対して false です。
if ([mappingsForContext isKindOfClass:[NSDictionary class]]) {
results = [self performKeyPathMappingUsingMappingDictionary:mappingsForContext];
foundMappable = (results != nil);
正しいように見えるが、適切に実行したくないと思われるコードを次に示します。
// init the Object Manager
RKURL *baseURL = [RKURL URLWithBaseURLString:SERVER_ADDRESS];
RKObjectManager *objectManager = [RKObjectManager objectManagerWithBaseURL:baseURL];
objectManager.client.baseURL = baseURL;
// Mapping
RKObjectMapping *ownerMapping = [RKObjectMapping mappingForClass: [DogOwner class]];
[ownerMapping mapKeyPath:@"DogOwnerId" toAttribute:@"dogOwnerID"];
[ownerMapping mapKeyPath:@"DogName" toAttribute:@"dogName"];
[ownerMapping mapKeyPath:@"OwnerFirstName" toAttribute:@"ownerFirstName"];
[[RKObjectManager sharedManager].mappingProvider setObjectMapping:ownerMapping forResourcePathPattern:@"/DogOwner"];
[[RKObjectManager sharedManager] loadObjectsAtResourcePath: @"/dogowner" delegate:self];
何か案は?