ios - 队列优先级似乎不对

标签 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")
    }
}

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

我不明白?

谁能给我解释一下?

谢谢!

最佳答案

问题不在于队列中的少量工作。在您的情况下,即使您将打印数量增加到任何数量,I am in main queue 也可能永远不会首先被调用。

如果多次运行代码,您会看到 I am in main queue 显示在不同的状态,因为 async 命令将作业提交到队列,不管是主队列还是后台队列,现在都不会执行,根据待执行队列的负载情况,需要几毫秒。

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

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

如果您想首先执行“我在主队列中”,只需将其从调度队列中删除即可。这有点像在说“现在就执行”。

关于ios - 队列优先级似乎不对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52773743/

相关文章:

android - 设置填充是否会更改 Android 或 IOS 上的 View 大小?

ios - 如何获取具有最大 ID 的项目?

ios - 使 App Store 上拒绝的版本无效或删除以重用版本号

ios - 嵌套的 Firebase 完成 block

ios - TransformedValueClass 返回 AnyObject 类型的数组

iphone - UIDocumentInteractionController 没有出现

ios - 禁用 Firebase Analytics for iOS 调试版本

ios - 无法更改UINavigationBar提示颜色和字体

ios - Xcode 10 无法构建项目,因为找不到 pod

arrays - 将日期数组从最近到最旧排序,同时更改其他数组以匹配顺序