队列优先级似乎不正确

时间:2018-10-12 06:43:14

标签: ios swift

所以我正在测试一些线程代码

private func queuesWithQos(){
    let queue1 = DispatchQueue(label: "com.appcoda.queue1", qos: .userInitiated)
    let queue2 = DispatchQueue(label: "com.appcoda.queue2", qos: .utility)

    queue1.async {
        print("Queue1 thread: \(Thread.current)")
        for i in 0..<10{
            print("Queue1:", i)
        }
    }

    queue2.async {
        print("Queue2 thread: \(Thread.current)")
        for i in 100..<110{
            print("Queue2", i)
        }
    }

    DispatchQueue.main.async {
        print("I am in main queue")
    }
}

而且,我认为在这种情况下应该首先打印“我在主队列中”,因为它是主线程并且具有最高优先级?但是显然,它是最后印刷的吗?

我不明白吗?

有人可以向我解释吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您放入不同队列中的任务非常简单。实际上,它们是如此简单,以至于整个块将在上下文切换发生之前执行,并且控件将传递到其他队列。

尝试将for循环的范围增加到例如1000000;您应该能够注意到差异。为了公平起见,在主队列中也放置一个类似的循环。

答案 1 :(得分:0)

问题不是队列中的工作量少。就您而言,即使您将打印数量增加到任何数量,也有可能永远不会先调用I am in main queue

如果您多次运行代码,您会看到I am in main queue显示在不同的状态,因为async命令将作业提交到队列中,无论是主作业还是主作业都没有关系。后台队列,它将暂时不执行,这将需要几毫秒的时间,具体取决于要执行的队列的负载。

在您的情况下,“我在主队列中”作业计划执行仅需几毫秒的时间,但是其他作业有足够的时间开始执行其作业(并可能完成它们)。这就是为什么您首先看到其他日志的原因,这是计划时间延迟。

还必须记住,主队列负责UI显示,因此,如果正在进行渲染或其他阻止操作,则可能需要更多时间来执行您的工作。

如果要首先执行“我在主队列中”,只需将其从调度队列中删除。就像说“立即执行”。