2013-12-14 39 views
3
- (BOOL)do_a_Restkit_request_and_return_a_boolean 
{ 
    [manager postObject:nil path:@"/mypath" parameters:@{@"password":password} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
      myResult = [mappingResult firstObject] == 5; 
     } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
     }]; 

     return myResult; 

} 

你好我想做一個RestKit調用像上面的同步,以便在成功塊的調用後返回myResult。使用RestKit執行同步請求

+1

RestKit建立在AFNetworking上,它不會這樣做。你可以發佈你的想要同步返回的理由嗎?如果完全可以在可能的情況下重寫代碼,那麼在完成塊調用觸發所需行爲的方法時,幾乎肯定會更好。 –

+0

我將此代碼傳遞給塊變量。該塊由庫同步使用以返回布爾值。 – ageorgios

回答

4

您可以使用這樣的方法:

NSMutableURLRequest *request = // create a request… 
RKObjectRequestOperation *operation = [manager objectRequestOperationWithRequest:request success:nil failure:nil]; 
[operation start]; 
[operation waitUntilFinished]; 

BOOL myResult = NO; 

if (!operation.error) { 
     myResult = [operation.mappingResult firstObject] == 5; 
} 

return myResult; 

注:

  • 完成模塊稱爲後的操作完成,因此,如果您提供的成功/失敗塊,他們將不會被調用,直到方法返回
    • (這就是爲什麼我建議你通過nil進入完成塊。)
  • waitUntilFinished將阻止您所在的任何線程,因此請確保它不是主線程。
  • 如果您在創建request時需要幫助,請參閱Creating Request Objects in the RKObjectManager Class Reference
  • 同樣,如果您可以重寫代碼以異步工作,那可能會比這個解決方案更好。
+0

This Works!非常感謝你!唯一的缺點是你不能輕鬆發佈對象,只有參數。 – ageorgios

+0

@ageorgios您應該可以通過使用'multipartFormRequestWithObject:method:path:parameters:constructBodyWithBlock:' –

+0

發出一個請求來發布對象。推論是有一個RKManagedObjectRequestOperation相當於Core Data支持的RestKit用戶。 –

1

您需要擁抱網絡通信的異步性質和響應的後臺處理,或者使用不同的API /技術專門用於進行同步請求。 RestKit和AFNetworking基於前者。

擁抱異步是最好的選擇...

這就是說,你可以使用RestKit創建NSURLRequest,然後用NSURLConnection同步下載的反應,然後用RKMapperOperation執行映射(和等待完成與addOperations:waitUntilFinished:)。