2012-08-01 44 views
0

將用戶登錄到我的應用程序時,我需要僅使用用戶名從服務器拉下用戶對象。這將返回userId(除其他外),以​​便進行其他API調用。從那一刻起,我將使用userId進行其他一些HTTP調用。如何在發送其他呼叫之前進行同步呼叫以完全拉下用戶對象?與RestKit進行同步HTTP調用

我設置我的對象映射在我的應用程序委託類,它完美的作品,和我使用此代碼從服務器獲取用戶對象了下來:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:[_userNameField text]] delegate:self]; 

這是我已經試過......這裏建議:Making synchronous calls with RestKit

RKObjectLoader* loader = [[RKObjectManager sharedManager] objectLoaderForObject:currentUser method:RKRequestMethodPUT delegate:nil]; 
RKResponse* response = [loader sendSynchronously]; 

但是這個代碼(1)採用的方法已過時objectLoaderForObject和(2)崩潰說'Unable to find a routable path for object of type '(null)' for HTTP Method 'POST''

+1

這不是一個好設計。你永遠不應該對Web服務器進行同步調用。如果您首先需要這些信息,那麼您的應用程序應該處理沒有信息的情況(例如沒有互聯網連接),以及信息何時到達(代表或觀察員等) – 2012-08-02 06:38:51

回答

4

撇開這是否是iPhone應用程序的理想設計的問題,我能夠完成我希望使用塊的內容。

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:[_userNameField text]] usingBlock:^(RKObjectLoader* loader) { 

    loader.onDidLoadResponse = ^(RKResponse *response) { 

     NSLog(@"Response: \n%@", [response bodyAsString]); 
    }; 

    loader.onDidLoadObjects = ^(NSArray *objects) { 

     APIUser *apiUser = [objects objectAtIndex:0]; 
     NSLog(@"user_id is %i", apiUser.user_id); 


    }; 

    loader.onDidFailWithError = ^(NSError *error) { 


      UIAlertView *badLoginAlert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"LOGIN_FAILED", nil) 
                    message:NSLocalizedString(@"BAD PASSWORD OR USERNAME", nil) 
                    delegate:self 
                 cancelButtonTitle:NSLocalizedString(@"OK", nil) 
                 otherButtonTitles:nil]; 
      [badLoginAlert show];   
    }; 
}]; 

希望這可以幫助別人。

+0

+2,例如帶塊,-1設計問題= +1 – 2012-09-21 08:34:40

+0

正如我所指出的,這不是一個理想的方法。在某些情況下,您無法更改後端API,這可能會幫助您。 – 2012-09-22 01:09:47

+0

我同意這不是一個普通應用程序的好主意,但同步調用可以讓你的測試單元更容易編程。 – axello 2012-10-29 14:19:00