2012-01-03 72 views
3

我有一個使用RestKit和Sinatra支持的服務器的小應用程序。當我將用戶對象發佈到服務器時,服務器成功保存用戶,並以新創建的用戶的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對象。我想這應該是可能的,因爲我傳遞一個引用張貼對象到對象加載器。如何獲得對象加載器在成功響應時更新userId? (我希望能夠做到這一點,而不必捕獲響應本身。)

+0

我似乎無法將RKSpecResponseLoader導入到我在iOS上的單元測試中。我需要使用什麼庫來與我的測試目標進行編譯? – cipherz 2012-02-29 16:16:39

+0

我最終將RKSpecResponseLoader直接複製並修改到我的測試目標中,對其進行修改並從那裏進行編譯。這樣,我就可以添加和修改響應加載器的功能而不會中斷RestKit構建。 – jacobsimeon 2012-03-01 01:21:44

回答

4

什麼讓你認爲新的用戶對象沒有被更新一旦postObject成功?

我的理解是,如果您在postObject中,在RKObjectLoader中,它會嘗試將響應映射回作爲默認行爲POST'd的原始對象。要讓它不這樣做的唯一方法是如果您爲目標對象開出帳單。

嘗試這樣:

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

只要你正確地有映射設置(從服務器進入的objc模型和從objc模型到服務器),你有你的keyPath設置正確的(是json {用戶:{用戶的東西}}或只是{用戶的東西}),那麼它應該「只是工作」。

+0

你好再來lottadot。你是完全正確的。我只是明白了這一點。對象**正在更新,但我沒有設置核心數據來保留服務器分配的userId屬性。看來RK/CoreData只會更新聲明爲對象模型一部分的對象的屬性。 – jacobsimeon 2012-01-04 01:09:24