2012-01-03 8 views
3

SinatraをサポートするサーバーでRestKitを使用する小さなアプリケーションがあります。ユーザーオブジェクトをサーバーに投稿すると、サーバーはユーザーを正常に保存し、新しく作成されたユーザーのjson表現で応答します。ここでRestKit - オブジェクトを投稿してその属性を更新します

は、クライアント上のユーザーを作成するためのコードです:

User *currentUser = [User currentUser]; 
    currentUser.email = @"[email protected]"; 
    currentUser.firstName = @"Jacob"; 
    currentUser.lastName = @"Morris"; 
    currentUser.phone = @"2088956709"; 
    currentUser.deviceId = @"MY-DEVICE-ID"; 
    currentUser.password = @"password"; 
    currentUser.passwordConfirmation = @"password"; 
    currentUser.timeStamp = [NSNumber numberWithFloat:3987987987.12233]; //totally random 

    RKSpecResponseLoader *loader = [RKSpecResponseLoader responseLoader]; 
    [dataController.rkObjectManager postObject:currentUser mapResponseWith:[User rkObjectMapping] delegate:loader]; 
    [loader waitForResponse]; 
    NSLog(@"Current user id is now: %@", currentUser.userId); 
    STAssertTrue([loader success], @"response from server should be a success"); 

サーバから戻ってくる応答は次のようになります。

"{\"user\":{\"deviceId\":\"MY-DEVICE-ID\",\"email\":\"[email protected]\",\"userId\":5,\"lastName\":\"Morris\",\"phone\":\"\",\"timeStamp\":3987987968.0}}"

サーバがuserIdを割り当てるための責任がありますオブジェクトの作成に成功したとき。 応答が返ってくると、クライアント側でcurrentUserオブジェクトを更新したいと思います。投稿されたオブジェクトへの参照をオブジェクトローダーに渡しているので、これが可能であるはずです。どのようにして、成功したレスポンスでユーザーIDを更新するためにオブジェクトローダーを取得できますか? (私は、応答自体をキャプチャすることなくこれを行うことができるようにしたい)

+0

iOSのユニットテストにRKSpecResponseLoaderをインポートできないようです。テストターゲットをコンパイルするにはどのようなライブラリを使用する必要がありますか? – cipherz

+0

RKSpecResponseLoaderをテストターゲットに直接コピーして変更し、修正してコンパイルしました。そうすれば、私はRestKitビルドを壊さずにレスポンスローダーの機能を追加して変更することができました。 – jacobsimeon

答えて

4

postObjectが成功すると、新しいUserオブジェクトが更新されないと思いますか?

私が理解しているのは、RKObjectLoaderでpostObjectを使用すると、応答が元のオブジェクトに戻されるようになり、デフォルトの動作としてPOSTされます。それをしないようにする唯一の方法は、あなたがターゲットオブジェクトを請求する場合です。

このような何か試してみてください:限り、あなたが正しくマッピングを設定している(にObjC-モデルにサーバーから来るとにObjC-モデルからサーバーへ)と、あなたのキーパスを設定しているよう

[[RKObjectManager sharedManager] postObject: currentUser delegate:self block:^(RKObjectLoader* loader) { 
      loader.resourcePath = @"/users"; 
      loader.objectMapping = [[RKObjectManager  sharedManager].mappingProvider objectMappingForKeyPath:@"/users"]; 
}]; 

を正しく(json {ユーザー:{ユーザーのもの}}か{ユーザーのもの}のみ)、それは「うまくいく」べきです。

+0

こんにちは。あなたはまったく正しい。私はちょうどこれを考え出した。オブジェクト**は**更新されていますが、サーバー割り当てのuserId属性を保持するようにコアデータを設定していません。 RK/CoreDataは、オブジェクトモデルの一部として宣言されたオブジェクトのプロパティのみを更新するようです。 – jacobsimeon

関連する問題