2012-02-27 35 views
4

我開始同步我的ASIHTTPrequest在這樣一個單獨的線程:能在ASIHTTPRequest/AFNetworking後臺線程上執行一個completionBlock嗎?

//inside this start method I create my ASIHTTPRequest and start it 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    [process start]; 
}); 

但completionBlock仍然打響了主線程上。 是否可以將completionBlock的執行保存在與請求開始時相同的線程中?

我可以想出解決這個問題的唯一方法是定義一個調度隊列,並在同一個線程中手動執行completionBlock,從而持有對創建隊列的引用。但是這並沒有直接解決它,因爲在將其餘代碼重定向到創建的分派隊列之前,您會在主線程中傳遞一個令人擔憂的時刻。

有人有更好的解決方案嗎?

編輯:同樣也是AFNetworking完成塊真的......

回答

4

好的,回答我自己的問題: ASIHTTPRequest框架沒有選項來啓動不同線程中的完成塊。

而是可以使用AFNetwork框架。在這裏你有任何類型的AFOperation稱爲'successCallbackQueue'和'failureCallbackQueue'兩個屬性。您可以在哪裏添加預定義的'dispatch_queue_t'來處理成功和失敗塊的執行。

希望這會幫助他人解決同樣的問題!

UPDATE:例

dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL); 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:yourRequest]; 
operation.successCallbackQueue = requestQueue; 
operation.failureCallbackQueue = requestQueue; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // add code for completion 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    // add code for failure 
}]; 
[operation start]; 
+0

你介意發表一個這樣的例子嗎?我正在爲同樣的事情苦苦掙扎,但我沒有足夠的精通Obj-C來理解如何在沒有示例的情況下實現您的解決方案。謝謝! – Julian 2012-04-18 21:53:41

+1

剛剛更新了一個例子的答案,希望這有助於!另外請確保在不再需要時釋放requestQueue,因此最好創建一個實例變量並使用dispatch_release(requestQueue)釋放它; – Yannick 2012-04-20 06:38:16

+0

似乎AFHTTPRequestOperation不再具有這些屬性...認爲它現在是「completionQueue」 – shim 2015-10-20 22:16:59

0

嘗試使用定義了自己創作的隊列。然後,您可以(一旦它終於完成,在其完成塊中)發回全局隊列以更新任何必要的顯示。

+0

你是什麼意思與全局隊列? – Yannick 2012-02-27 13:41:55

+0

對不起 - 實際上我的意思是'dispatch_get_main_queue'。蘋果有一個偉大的視頻:「第308場 - 塊和大中央調度實踐」,我指的是30:28左右的模式。如果您是Apple開發人員,則免費。 :) – 2012-02-27 13:52:18

+0

好吧,現在我確定你的意思,我需要告訴你,這不是我在這裏尋找的。完成此ASIHTTPRequest後,completionBlock中的代碼將自動在「dispatch_get_main_queue」上調用。我試圖不這樣做;)。我想繼續執行在同一線程中調用開始在... – Yannick 2012-02-27 14:12:12

相關問題