2011-11-30 62 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()之后退出?)。