3

私は ios/RESTKIT が初めてです。RESTKIT を使用して iOS デバイスから Web サービスを利用しようとしています。json の戻り値には、2 つの結果が考えられます。

A)失敗すると、 jsonの結果は次のようになります (結果は文字列 "null" です。エラー コードは利用可能です)。

{
    status: false,
    result: null
    error: NO_SUCH_USER
}

(A) のマッピング

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[WsReturn class]];
    [mapping mapKeyPath:@"result" toAttribute:@"result"];
    [mapping mapKeyPath:@"status" toAttribute:@"status"];
    [mapping mapKeyPath:@"error" toAttribute:@"error"];
    [objectManager.mappingProvider setMapping:mapping forKeyPath:@"/"];

B)成功すると、次のようになります (結果は「複雑なオブジェクト」です。エラー コードは null です):

{
    status: true,
    result: {   
       name: "Some User",
       tasks: [
            {
              name: "Some Task1",
              taskId: 10
            },
            {
              name: "Some Task2",
              taskId: 20
            }
       ]
    },
    error: null
}

(B) のマッピング

RKObjectMapping* taskMapping = [RKObjectMapping mappingForClass:[Task class]];
    [taskMapping mapKeyPath:@"name" toAttribute:@"name"];
    [taskMapping mapKeyPath:@"taskId" toAttribute:@"taskId"];
    [objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"]; 

RKObjectMapping* resultMapping = [RKObjectMapping mappingForClass:[Result class]];
    [resultMapping mapKeyPath:@"name" toAttribute:@"name"];
    [resultMapping mapRelationship:@"tasks" withMapping:taskMapping];
    [objectManager.mappingProvider setMapping:resultMapping forKeyPath:@"result"];

RKObjectMapping* cmplxMapng = [RKObjectMapping mappingForClass:[WsReturn class]];
    [cmplxMapng mapKeyPath:@"status" toAttribute:@"status"];
    [cmplxMapng mapKeyPath:@"error" toAttribute:@"error"];
    [cmplxMapng mapRelationship:@"result" withMapping:resultMapping];
    [objectManager.mappingProvider setMapping:cmplxMapng forKeyPath:@"/"];

質問

1) (A) 正常に動作します。(B) しません。いくつかの指針を提供できますか?

2) 同じ Web サービス呼び出しの場合、「結果」部分は文字列 (null) または複雑なオブジェクトである可能性があります。では、これをコードでどのように処理すればよいでしょうか。どのマッピングを渡しますか? マッピングまたは cmplxMapng (横スクロールを避けるために名前が変更されました)?

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/myUrl"
objectMapping: HOW_TO_DECIDE_WHICH_MAPPING_TO_PASS_HERE delegate:self];

これは一般的なシナリオだと思います。検索しましたが、関連する例は見つかりませんでした。多分私は間違った場所を見ました。これにアプローチする方法についての考え/指針が役立ちます。ありがとう。

4

1 に答える 1

5

だからこれが私がそれを解決した方法です-

1)この行を置き換えました:

[objectManager.mappingProvider setMapping:taskMapping forKeyPath:@"tasks"];    

これで:(KeyPathの通知)

[objectManager.mappingProvider setMapping:uooMapping forKeyPath:@"result.tasks"]; 

2)このスレッドhttp://groups.google.com/group/restkit/browse_thread/thread/89b25b3f0f7e0177に従い、Blake の提案に従って次の行を追加しました。

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]]; 

loadObjectsAtResourcePathの呼び出しの直前

3)さまざまな方法でオブジェクトをマッピングすることに関しては、cmlxMapng を渡すと常に機能するように見えることがわかりました。

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/myUrl"     
                                 objectMapping:cmplxMapng delegate:self];

したがって、「結果」部分が文字列「null」として返された場合、結果と「ステータス」および「エラー」フィールドの「(null)」が正しくマッピングされます。動作します!

これが誰かに役立つことを願っています。

于 2011-12-14T16:50:09.180 に答える