【发布时间】:2021-02-04 17:51:28
【问题描述】:
OperationQueue 文档说明了 qualityOfService 属性:
This property specifies the service level applied to operation
objects added to the queue
但是,只需将下面的代码复制并粘贴到新的 Playground 中,就可以简单地检查这是否不正确。
import Foundation
let q = OperationQueue()
q.qualityOfService = .userInitiated
print("QUEUE", q.qualityOfService.rawValue)
let op = BlockOperation()
op.addExecutionBlock {
print("OP", op.qualityOfService.rawValue)
}
q.addOperations([op], waitUntilFinished: true)
您将看到队列 QoS 级别为 25/.userInitiated 和操作 -1/.default。
那么这是否意味着操作 QoS 级别相对于提升的队列 @987654332@ 级别是 .default,或者它是 .default,尽管队列具有更高的 QoS 级别?
我实际上期望的是这两个值应该是相同的。
PS:我需要在Operation 中调用Process,而qualityOfService 的设置应该与队列/操作相同。
【问题讨论】:
-
这很奇怪,因为
op.qualityOfService属性的文档说明“此属性的默认值为 NSQualityOfServiceBackground,您应该尽可能保留该值。”您可以通过在设备上启用低功耗模式来检查它 - 如果系统解释为op.qualityOfService == .background,则在禁用低功耗模式之前不会执行操作。 -
@EugeneDudnyk - 首先,文档不正确。该操作的默认 QoS 是
default,如 Erik 的问题所示,而不是文档建议的background。我已经提交了一份关于文档的错误报告。其次,我建议不要通过查看它是否在低功耗模式下运行来确定后台 QoS。低功耗并不意味着后台 QoS 调度或操作队列中的某些内容无法运行,只是它可能不会运行(直到您离开低功耗模式)。如果要查看 QoS 是什么,请参考线程的qualityOfService值。 -
@Rob,不确定您的第二个陈述,因为此处的文档 developer.apple.com/library/archive/documentation/Performance/… 指出以下内容:重要的是,至少 90% 的时间在实用程序的 QoS 级别或更低的情况下运行您的应用程序当用户活动没有发生时。在 iPhone 上,当启用低功耗模式时,自主和后台操作(包括网络)会暂停。请参阅对 iPhone 上的低功耗模式做出反应。”
-
@EugeneDudnyk - 是的。我刚刚测试了它。 (我真的不是说这听起来像我确信的那样刻薄,但你测试过你的说法了吗?)不要误会我的意思:我相信操作系统会减少运行的类型在后台/实用程序队列上(我当然希望如此!),但它似乎不像“打开低功耗模式并且分派到后台队列的任务无法运行”那么简单。
-
@EugeneDudnyk - 仅供参考,the documentation 已更正以反映操作的默认值为
.default,而不是.background。
标签: ios swift macos cocoa grand-central-dispatch