iOS GCD 全局队列优先级均为 0.5

标签 ios dispatch

我遇到的问题是为什么下面的代码打印出来的优先级是一样的?为什么是这样?非常感谢。

    print("main:\(Thread.current)")
    print("thread main priorities:\(Thread.current.threadPriority)")

    DispatchQueue.global(qos: .utility).async {
        print("utility:\(Thread.current)")
        print("thread utility priorities:\(Thread.current.threadPriority)")
    }

    DispatchQueue.global(qos: .background).async {
        print("background:\(Thread.current)")
        print("thread background priorities:\(Thread.current.threadPriority)")
    }

    DispatchQueue.global(qos: .userInteractive).async {
        print("userInteractive:\(Thread.current)")
        print("thread userInteractive priorities:\(Thread.current.threadPriority)")
    }

    DispatchQueue.global(qos: .userInitiated).async {
        print("userInitiated:\(Thread.current)")
        print("thread userInitiated priorities:\(Thread.current.threadPriority)")
    }

日志:

主要:{数字= 1,名称=主要} 线程主优先级:0.5

用户交互:{number = 3,name = (null)}

实用程序:{number = 5,name = (null)}

背景:{数字= 6,名称=(空)}

线程用户交互优先级:0.5

用户启动:{number = 4,name = (null)}

线程实用程序优先级:0.5

线程后台优先级:0.5

线程用户启动优先级:0.5

最佳答案

正如您在文档中看到的:

@available(iOS 4.0, *)
open var threadPriority: Double // To be deprecated; use qualityOfService below

threadPriority 已弃用。另外,Apple 的 GCD 团队对于线程 - 队列主题已经非常明确。 GCD 将为您管理线程。队列优先级不是线程优先级。看一下这个示例,这是您在此处发布的代码,几乎,我刚刚添加了“qos_class_self().rawValue”,这实际上是您应该测试 QoS 的方式,而不是使用“threadPriority”。

print("main:\(Thread.current), Thread main priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")

DispatchQueue.global(qos: .utility).async {
    print("utility:\(Thread.current), Thread utility priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

DispatchQueue.global(qos: .background).async {
    print("background:\(Thread.current), Thread background priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

DispatchQueue.global(qos: .userInteractive).async {
    print("userInteractive:\(Thread.current), Thread userInteractive priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

DispatchQueue.global(qos: .userInitiated).async {
    print("userInitiated:\(Thread.current), Thread userInitiated priorities:\(Thread.current.threadPriority), QoS: \(qos_class_self().rawValue)")
}

我还组合了每个闭合的打印,这样它们就不会在日志中的不同行中被打乱。这表明 QoS 得到维护,而 threadPriority 已被弃用。

main:<NSThread: 0x6100000762c0>{number = 1, name = main}, Thread main priorities:0.5, QoS: 33
userInteractive:<NSThread: 0x610000261fc0>{number = 4, name = (null)}, Thread userInteractive priorities:0.5, QoS: 33
utility:<NSThread: 0x618000079100>{number = 3, name = (null)}, Thread utility priorities:0.5, QoS: 17
userInitiated:<NSThread: 0x608000078380>{number = 5, name = (null)}, Thread userInitiated priorities:0.5, QoS: 25
background:<NSThread: 0x610000262000>{number = 6, name = (null)}, Thread background priorities:0.5, QoS: 9

所以,最后,要点不是考虑线程,而是考虑队列、它们的 QoS,并知道 GCD 将为您管理线程。这与我们在 GCD 出现队列之前所习惯的概念非常不同。

关于iOS GCD 全局队列优先级均为 0.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44358144/

相关文章:

ios - 无法呈现 View Controller (SLComposeViewController)

ios - 检查 iOS 键盘中是否存在单词建议/词典

ios - 如何将 dispatch_data_t 转换为 NSData?

javascript - React Redux - 调度检索输入值

swift - Swift 中的嵌套异步调用

ios - 使用 Ionicons 作为背景内容和绝对定位的 Safari 中的 CSS 故障

ios - 在“init”中初始化的对象无法在“viewDidLoad”中访问

ios - iOS 8中的UIPopoverController

ios - dispatch_async 处理事件