异步队列如何与此示例代码一起工作

时间:2018-12-12 11:03:58

标签: ios swift multithreading

我编写了一个示例代码,以深入了解以下线程概念。

print("a")
DispatchQueue.global(qos: .default).async {
   print("b")
   DispatchQueue.global(qos: .default).async {
      print("c")
      DispatchQueue.global(qos: .default).async {
        print("d")
        DispatchQueue.global(qos: .default).async {
         print("e")
        }
        print("f")
      }
      print("g")
   }
   print("h")
}
print("i")

输出

a
i
b
h
c
g
d
f
e

输出看起来像这样。内部到底发生了什么?

3 个答案:

答案 0 :(得分:2)

有两种基本行为:

  1. 顾名思义,总是在封闭范围– {} –退出后执行

    因此ib之前打印,hc等之前打印。

  2. 默认情况下,调度队列是串行工作的,所有任务都依次执行

    因此连续订单为i - b - h - c - g - d - f - e

答案 1 :(得分:1)

想法是其中任意2行1是

DispatchQueue.global(qos: .default).async

第二个将首先运行,因此

print("a")
DispatchQueue.global(qos: .default).async {  
 print("b")
}
print("i")

给予

a // comes first
i // printed first before queue as the queue dispatches the execution with some delay
b // printed second

然后进入异步并应用相同的规则

   DispatchQueue.global(qos: .default).async {
      print("c")
      DispatchQueue.global(qos: .default).async {  
      print("d")
      }
      print("g")
   }
   print("h")


h

c

g

d

答案 2 :(得分:1)

在每个DispatchQueue上,全局上下文都被拆分了,而分发的成本却比简单打印要高。