2012-08-07 86 views
2

我想用RestKit同步加載對象,並在後臺線程上使用[anObjectLoader sendSynchronously]。然後在RKObjectLoaderdidFinishLoad:應用程序當前停在第一條線:從RKRequestNSAssert([NSThread isMainThread], @"RKObjectLoaderDelegate callbacks must occur on the main thread");

望着documentation,該sendSynchronously法說,該請求將被同步請求和水合響應對象將返回。

這是我的代碼的快照:RestKit sendSynchronously方法的最佳做法

RKObjectLoader *anObjectLoader = [self.objectManager loaderWithResourcePath:resourcePath]; 
NSLog(@"Response: %@", [anObjectLoader sendSynchronously]); 

在控制檯上:

*** Assertion failure in -[RKManagedObjectLoader didFinishLoad:], ...RestKit/Code/ObjectMapping/RKObjectLoader.m:423 

是否確定使用RestKit與同步調用?
有更好的方法發送同步請求嗎?
我錯過了什麼嗎?

回答

2

你不應該進行同步調用。使用send方法並使用委託或塊回調捕獲響應。除此之外,此方法針對網絡帶寬使用進行了優化,並且還可以正確處理線程。

順便說一句,RKObjectLoader要求主線程的原因是因爲那是你主要的對象上下文所在。

+0

謝謝保羅。在閱讀網絡上的其他問題和答案後[1](http://stackoverflow.com/questions/7325181/making-synchronous-calls-with-restkit),[2](https://groups.google.com/forum /?fromgroups#!searchin/restkit/synchronous/restkit/ozbyf9hbbHY/4FUGPiZKIXwJ),[3](https://groups.google.com/forum/?fromgroups#!searchin/restkit/synchronous/restkit/jUHOJOF4_nk/ FULzlmEy14gJ)等等,我最終同意你的答案。 – georgepiva 2012-08-07 16:28:11

1

我最近有同樣的問題。我想出瞭如何使用塊發送同步呼叫,實際上它非常好。基本上你可以做任何restkit打電話給你打算做的事情,但不要將代理設置爲self,而是使用usingBlock。然後,在該塊中,您可以處理來自API調用的各種響應。

塊示例(APIUser是一流的,我寫的是代表當前用戶):

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

    loader.onDidLoadResponse = ^(RKResponse *response) { 

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

    loader.onDidLoadObjects = ^(NSArray *objects) { 

     APIUser *apiUser = [objects objectAtIndex:0];  

    }; 

    loader.onDidFailWithError = ^(NSError *error) { 

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

我原來的問題和回答can be found here

+1

我不認爲這是同步呼叫?這只是一個取代委託電話的異步電話,不是嗎? – makdad 2012-10-04 06:32:26

+0

我同意你是對的。然而,該解決方案仍然有幫助,因爲使用塊可以保證在發出下一個呼叫之前一次呼叫已成功完成。我不會推薦它嵌套塊和調用,但我認爲有些情況下它是有用的。 – 2012-10-31 21:48:24