Objective c dispatch\u async自定义队列从不退出块
问题是“伟大的成功!”永远不会出现,并且在代码最外层Objective c dispatch\u async自定义队列从不退出块,objective-c,ios,multithreading,grand-central-dispatch,Objective C,Ios,Multithreading,Grand Central Dispatch,问题是“伟大的成功!”永远不会出现,并且在代码最外层dispatch\u async块的末尾之外不会发生任何事情。我不确定我做错了什么,但我知道这有严重的问题。您过早地释放了下载队列。您需要等到它执行了块之后。建议将释放放在块的末尾 重要的是要记住,在第一次调用dispatch_async()之前保留目标队列,并在完成回调结束时释放该队列,以确保在完成回调挂起时未释放目标队列 此代码有几个问题: 创建callerQueue后,不需要保留它。它已经创建了retaincount为1,并且在以后发布时
dispatch\u async
块的末尾之外不会发生任何事情。我不确定我做错了什么,但我知道这有严重的问题。您过早地释放了下载队列。您需要等到它执行了块之后。建议将释放放在块的末尾
重要的是要记住,在第一次调用dispatch_async()
之前保留目标队列,并在完成回调结束时释放该队列,以确保在完成回调挂起时未释放目标队列
此代码有几个问题:
代码的其余部分看起来很好(并且您不必像其他人建议的那样从块中释放下载队列,因为dispatch_async()调用也会保留它。我们缺少的代码片段肯定还有更多(比如,代码是否在执行NSLog()后立即退出?).尝试了您的代码,它正在工作:确实如此……所以这一定与下载队列提前释放有关,我想下载需要一段时间。
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!");