2011-11-30 79 views
5
dispatch_queue_t callerQueue = dispatch_get_current_queue(); 
dispatch_retain(callerQueue); 
dispatch_queue_t downloadQueue = dispatch_queue_create("Download Queue",NULL); 

dispatch_async(downloadQueue, 
^{ 
    //some code that accesses a web service 
    dispatch_async(callerQueue, 
    ^{ 
     //some code that accesses UI 
    }); 
}); 
dispatch_release(downloadQueue); 
NSLog(@"great successing!"); 

問題是,「大獲成功!」從來沒有出現過,並且在代碼最外面的塊的末尾沒有發生任何事情。我不確定我做錯了什麼,但我知道這有些嚴重錯誤。dispatch_async自定義隊列永遠不會退出塊

+0

試過了你的代碼,它正在工作:http://pastie.org/2944762 –

+0

確實如此是......所以它必須與提前發佈的下載隊列有關,我想下載需要一段時間。 –

回答

4

您正在釋放您的下載隊列太早。您需要等到它執行完該塊後。 dispatch_async man page建議將該版本放在塊的末尾。

重要的是要記住第一次調用dispatch_async()之前保留目標隊列,並釋放該隊列在完成回調結束,以確保在完成回調正在等待目標隊列不釋放是很重要的。

2

有幾個與此代碼的問題:

  1. 你不需要創建後保留callerQueue。它已經創建,保留計數爲1,並且稍後您可能會放棄。通過保留兩次,您可能會造成泄漏。

  2. 您不應該在主隊列以外的任何隊列(本例中不是callerQueue)上執行UI操作。

的代碼的其餘部分看起來不錯(和你沒有從塊中放出其下載隊列,爲他人所提出的建議,因爲dispatch_async()調用也將保留。必須有更多的代碼片段我們失蹤了(比如,代碼是否在執行NSLog()之後退出?)。

相關問題