Grand Central发布嵌套队列和不同的队列优先级

时间:2014-03-17 21:26:12

标签: ios objective-c grand-central-dispatch

我看到GCD的使用方式如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{         
     //do something it may take time here            
     dispatch_async(dispatch_get_main_queue(), ^
     {
          //UI updates on main
     });       
});       

这是可以理解的。但是我的想象力有点疯狂,我想如果有人像下面那样做会怎么样?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
    {
          dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
          {
              dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
              {                     
                  dispatch_async(dispatch_get_main_queue(), ^
                  {

                  });       
              });   
          });
    });
});

更糟糕的是,如果他们在上面使用DISPATCH_QUEUE_PRIORITY_BACKGROUNDDISPATCH_QUEUE_PRIORITY_DEFAULTDISPATCH_QUEUE_PRIORITY_LOWDISPATCH_QUEUE_PRIORITY_HIGH的混合物呢?

我并不是说上面的内容是好的,因为我只想学习阅读它,特别是一般我们如何阅读嵌套的GCD队列(以及QUEUE_PRIORITY混合的情况用的)?

我的理解是这(听起来很有趣):

嵌套队列就像房子里的房间,无论我进入房间内有多少房间,我仍然在房子里。换句话说,无论有多少嵌套(如上所述),我仍然在最外层队列上定义的队列中。

希望我的比喻是可以理解的。希望有人能告诉我如何阅读具有不同队列优先级的复杂嵌套队列/嵌套队列。感谢。

2 个答案:

答案 0 :(得分:2)

对于带有串行队列的dispatch_sync(),您的类比是合理的。如果您在一个队列上运行,并且dispatch_sync()运行到第二个队列,则运行的代码将阻止调度到这两个队列的任何其他队列,直到它完成为止。在这个意义上,它是"运行"两个队列。

这个比喻对dispatch_async()不起作用。如果您在一个队列上运行,并且dispatch_async()运行到第二个队列,则运行的代码与第一个队列没有关联。当该代码运行时,第一个队列可以运行其他东西,或者什么也不做,甚至被删除。在该代码完成之前,仅阻止调度到第二个队列的工作项。

小心调度优先级。 dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT)dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW)返回两个完全不同的队列。它不是一个具有多个优先级的全局队列;它取而代之是多个全局队列,每个优先级都有一个队列。

答案 1 :(得分:1)

当您将此视为“嵌套队列”时,我认为您的心理形象错误。第二个示例创建一个相对复杂的块A,并将其分派到队列中。队列包含需要执行的块列表,将块分派给队列意味着在该列表的末尾添加该块。在该块开始执行之前没有任何事情发生。

当块A开始执行时,它会创建另一个块B并将其附加到某个队列的末尾,然后块A结束。可能在其间调度了一些其他块,但最终块B到达其队列的开始并开始执行。它创建块C并将其添加到另一个队列的末尾,依此类推。没有任何嵌套进行。