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()
之前保留目标队列,并在完成回调结束时释放该队列,以确保在完成回调挂起时未释放目标队列


此代码有几个问题:

  • 创建callerQueue后,不需要保留它。它已经创建了retaincount为1,并且在以后发布时可能会消失。如果保留两次,则可能会造成泄漏

  • 除了主队列(在本例中不是callerQueue)之外,您不应该在任何队列上执行UI操作


  • 代码的其余部分看起来很好(并且您不必像其他人建议的那样从块中释放下载队列,因为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!");