【问题标题】:DispatchQueue.main.async {} in viewDidLoadviewDidLoad 中的 DispatchQueue.main.async {}
【发布时间】:2017-11-01 18:30:23
【问题描述】:

我想知道如果我从 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)时,它会立即返回并等待所有其他方法完成。队列没有任务后,它会完成我异步调用的方法。我的想法是对的吗?

【问题讨论】:

标签: ios swift asynchronous concurrency grand-central-dispatch


【解决方案1】:

我曾经问过similar question。让我引用我得到的答案的重要部分:

“因为主线程上的默认 runloop 具有特殊行为,即在运行时,它也会为主调度队列处理......”

当您对主线程执行dispatch_async 时,您的块{ self.secondSelector() } 被安排到主运行循环。由于viewDidLoad 方法已经被主运行循环执行,你的调度块将在viewDidLoad 之后处理,所有其他(可能的)块或在你的块之前调度的方法将被执行。

请记住,当您从主线程分派到主队列和主运行循环时,您的问题是关于 dispatch_async 的行为。 viewDidLoad 与它无关 - 这里唯一相关的是 UIViewController 的生命周期方法,如 viewDidLoadviewWillAppear 等都在主线程上运行(由主运行处理环形)。鉴于此方法在主线程上运行,您将看到除viewDidLoad 之外的任何方法的相同行为。如果您从其他线程调用 dispatch_async,您可能会对不同的结果感到惊讶,因为在这种情况下,您将有两个线程同时工作(您的另一个线程和您分派到的主线程)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多