[英]DispatchQueue.main.async {} in viewDidLoad
我想知道如果我从viewDidLoad方法在主队列中异步调用某些内容会发生什么。 一个小实验向我展示了这些结果:
这段代码:
override func viewDidLoad() {
super.viewDidLoad()
firstSelector()
DispatchQueue.main.async {
self.secondSelector()
}
for i in 1...10 {
print(i)
}
thirdSelector()
}
func firstSelector() {
print("First selector fired")
}
func secondSelector() {
print("Second selector fired")
}
func thirdSelector() {
print("Third selector fired")
}
给出这些印刷品:
First selector fired
1
2
3
4
5
6
7
8
9
10
Third selector fired
Second selector fired
所以最后一个被调用的方法是secondSelector。 我认为这是因为主队列是串行的,当我异步调用某个方法(在本例中为secondSelector)时,它立即返回并等待直到所有其他方法都完成。 在队列没有任务之后,它完成了我异步调用的方法。 我的想法是对的吗?
我曾经问过类似的问题 。 让我引用我得到的答案的重要部分:
“因为主线程上的默认runloop具有特殊的行为,在运行时,它还会处理主调度队列...”
当您对主线程执行dispatch_async
,您的块{ self.secondSelector() }
将被调度到主运行循环。 由于viewDidLoad
方法已由主运行循环执行,因此您的调度块将在viewDidLoad
之后处理,并且所有其他(可能的)块或方法将在块之前执行。
请记住,当您从主线程调度到主队列和主运行循环时,您的问题是关于dispatch_async
行为。 viewDidLoad
与它无关 - 这里唯一与之相关的是, UIViewController
的生命周期方法如viewDidLoad
, viewWillAppear
等都在主线程上运行(由主运行循环处理)。 鉴于此方法在主线程上运行,您将看到与viewDidLoad
之外的任何方法相同的行为。 如果从其他线程调用dispatch_async,您可能会对不同的结果感到惊讶,因为在这种情况下,您将有两个线程同时工作(您的另一个线程和您调度的主线程)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.