0

この動的な PUT リクエストを実行する必要があるとしましょう: "http://mydomain.com/api/5?value=66"

体は空です。戻り値として 201 (作成済み) ステータスが返され、本文で json オブジェクトが返されます。それを MyObject と呼びましょう。

現在、レストキットには次のオプションがあります。

- [[RKObjectManager sharedManager]  putObject:nil mapResponseWith:MyMapping delegate:self]; 

MyMapping は MyObject をマップします。問題は、nil を送信すると、マッピングがわからず、「HTTP メソッド 'PUT' のタイプ '(null)' のオブジェクトのルーティング可能なパスが見つかりません」というメッセージがスローされることです。

- [[RKClient sharedClient] put:putUrl params:nil delegate:self];

ここでputUrl = "http://mydomain.com/api/5?value=66" の問題は、応答のマッピングがないため、didLoadResponse のみがコールバックされ、didLoadObjects が呼び出されないことです。

[objectManager.router routeClass:[MyObject class] toResourcePath:putUrl forMethod:RKRequestMethodPUT]; 
    MyObject *obj = [[MyObject alloc] init];

    [[RKObjectManager sharedManager]  putObject:obj mapResponseWith:MyMapping  delegate:self];

ここでの問題は、最初にそれを偽造し(そうでないときに MyObject を param として送信する)、初めてしか機能しないことです。2 回目にこのメソッドを使用しようとすると、「クラス 'MyObject' と HTTP メソッド 'PUT' に対してルートが既に登録されています」という例外が発生します。

何をすべきか提案はありますか?

ありがとう

4

1 に答える 1

3

誰かが興味を持っているなら、restkitが何をしているかを見た後、答えを見つけました.

putUrl = "http://mydomain.com/api/5?value=66";

MyMapping maps the returned MyObject that has fields NSNumber* Id, NSString* name;

これを機能させるためのコードは次のとおりです。

void (^blockLoader)(RKObjectLoader *);

blockLoader = ^(RKObjectLoader *loader) {
    loader.delegate = self;
    loader.objectMapping = MyMapping;
};

NSString *resourcePath = putUrl;

[[RKObjectManager sharedManager] sendObject:nil toResourcePath:resourcePath usingBlock:^(RKObjectLoader *loader) {
    loader.method = RKRequestMethodPUT;
    blockLoader(loader);
}];
于 2012-08-09T13:09:15.543 に答える