我看到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_BACKGROUND
,DISPATCH_QUEUE_PRIORITY_DEFAULT
,DISPATCH_QUEUE_PRIORITY_LOW
,DISPATCH_QUEUE_PRIORITY_HIGH
的混合物呢?
我并不是说上面的内容是好的,因为我只想学习阅读它,特别是一般我们如何阅读嵌套的GCD
队列(以及QUEUE_PRIORITY
混合的情况用的)?
我的理解是这(听起来很有趣):
嵌套队列就像房子里的房间,无论我进入房间内有多少房间,我仍然在房子里。换句话说,无论有多少嵌套(如上所述),我仍然在最外层队列上定义的队列中。
希望我的比喻是可以理解的。希望有人能告诉我如何阅读具有不同队列优先级的复杂嵌套队列/嵌套队列。感谢。
答案 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并将其添加到另一个队列的末尾,依此类推。没有任何嵌套进行。