0

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];

何か案は?

4

1 に答える 1

0

あなたの問題に対する非常にコミカルなナレーションをありがとう。

1 つの間違いは、 へのマッピングを指定し/Dogownerてロードしようとしたこと/dogownerです。上記のあなたのコメントは、他にも2つの大きな問題を引き起こします

  1. xml と json は互換性がありません
  2. ソースキーパスが間違っていました。
于 2012-08-14T13:08:45.397 に答える