是DispatchQueue.global(qos:.userInteractive).async与DispatchQueue.main.async相同

NoP*_*rob 25 qos grand-central-dispatch ios swift dispatch-queue

我正在阅读教程:https: //www.raywenderlich.com/148513/grand-central-dispatch-tutorial-swift-3-part-1

并且遇到了QoS类用户交互的定义.它在那里提到它应该在主线程上运行.那么,我的问题是那之间的区别是什么

DispatchQueue.global(qos: .userInteractive).async{} 
Run Code Online (Sandbox Code Playgroud)

DispatchQueue.main.async{}
Run Code Online (Sandbox Code Playgroud)

谢谢!!

Dan*_*iel 20

这里描述了"服务质量"定义:

https://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html

看起来"主"线程将具有"用户交互"的QoS等级.但是,仅仅因为创建的QoS具有"用户交互"的QoS,并不意味着它是"主"线程.

您可以在Xcode调试器中观察到这一点.在异步块中放置一个断点,然后查看Debug Navigator活动线程面板.当DispatchQueue.global(qos: .userInteractive).async{}从主线程中调用,它会显示一个不同的名称主线程.

通常,主线程被视为应执行所有与视图相关的访问的特殊线程.如果某些事情会占用任何重要时间,例如调用Web服务,压缩文件等,您将需要在单独的队列中运行代码,并且当该过程完成时,返回到更新用户界面的主队列.

另请注意,在iOS 11中使用Xcode 9时,从非主线程访问用户界面对象时将发出警告.


cel*_*iux 6

DispatchQueue.global(qos: .userInteractive).async{}当您想要在用户与您的应用程序交互时在后台快速执行某些操作时,您可以使用它。这很少使用,因为它必须很快发生,您可能可以直接在主队列中执行它。

你可以看看这个讲座,里面对这个问题解释得很清楚。


Rob*_*ier 6

这些不一样。它们意味着不同的事物,您应该使用您所指的事物。主队列是userInteractive,但并非每个userInteractive队列都是主队列。苹果公司在使用GCD构建响应高效的应用程序中对此进行了很好的讨论。

在userInteractive级别上运行多个队列是有效的。如果您需要同时使用多个内核来执行为了维持流畅的用户交互(通常是某种动画)所需的计算,则此方法是适当的。这是非常罕见的,需要谨慎完成,但是如果您需要在主线程上计算某些内容,同时又在另一个内核上计算某些内容,以便跟上用户的操作,那就是它的目的。

但是只能有一个主队列。它碰巧是userInteractive,但这不是重点。大多数UIKit都不是线程安全的,仅在访问主队列上的那些类时有效,而不仅仅是任何userInteractive队列。

队列优先级更为复杂,它们首先出现。它们可以在队列之间传播,这样“低优先级”队列可能会暂时具有高优先级状态。苹果调整了它的工作原理,使整个系统更具响应性。这就是为什么始终要表达自己的意思而不是依赖于幕后工作方式的假设如此重要的原因。即使您的测试表明两个队列始终相同,也不足以知道两个队列在所有设备上或对于将来的OS版本都是相同的。


mat*_*att 5

任何说.userInitiated全局队列是主线程的人都是错误的。这是一个优先级很高的后台队列,但它是后台队列(并且与主线程不同,它是并发的)。

苹果自己的示例代码和注释使事情变得很清楚:

// This handler gets called on the main thread; dispatch to a background queue for processing.
DispatchQueue.global(qos: .userInitiated).async {
Run Code Online (Sandbox Code Playgroud)

毫无疑问,这证明了苹果公司认为.userInitiated全局队列是“后台队列”而不是“主线程”。

  • 该线程专门谈论“ userinteractive”而不是userInitiated。没有人说过userInitiated在主线程上。用户的问题特别与用户交互质量有关 (2认同)