并发(dispatchqueue)测试没有像预期的那样ios / swift

时间:2018-03-23 05:30:19

标签: ios swift multithreading concurrency

所以我在Swift 4游乐场中有这个代码:

//: Playground - noun: a place where people can play

import UIKit
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

DispatchQueue.main.async {
    for _ in 1...5 { print("Main") }
}

DispatchQueue.global().async {
    for _ in 1...5 { print("Background") }
}

DispatchQueue.global(qos: .userInteractive).async {
    for _ in 1...5 { print("User Interactive") }
}

为什么打印出来:

User Interactive
Background
Background
User Interactive
User Interactive
Background
User Interactive
Background
User Interactive
Background
Main
Main
Main
Main
Main

我理解为什么“用户互动”和“背景”以随机顺序打印出来,但为什么“主要”打印出来之后呢?它不应该优先考虑因为它在主队列中吗?我想我还是不完全理解GCD和QOS在Swift 4中是如何工作的。

修改 我现在添加了这两个打印输出和几行:

print("BEGINNING OF CODE")

DispatchQueue.main.async {
    for _ in 1...5 { print("Main") }
}

DispatchQueue.global().sync {
    for _ in 1...5 { print("Sync Global") }
}

DispatchQueue.global(qos: .background).async {
    for _ in 1...5 { print("Background") }
}
DispatchQueue.global(qos: .userInteractive).async {
    for _ in 1...5 { print("User Interactive") }
}

print("END OF CODE")

它打印出来:

BEGINNING OF CODE
Sync Global
Sync Global
Sync Global
Sync Global
Sync Global
END OF CODE
User Interactive
Background
User Interactive
User Interactive
User Interactive
User Interactive
Background
Background
Background
Background
Main
Main    
Main
Main
Main

现在我的问题是:不应该在“END OF CODE”之前打印出后台队列吗?如果最后两个块排队并立即开始执行,为什么不打印出来之前?是因为主队列有更高的优先级吗?但它不应该异步运行吗?

2 个答案:

答案 0 :(得分:0)

Global queues are non FIFO type ..他们很快就会找到一个可用的线程。这就是为什么他们跑得更快..

主队列任务在主线程上运行串行 ..当UI需要更新时,通常从后台调用

答案 1 :(得分:0)

操场上的代码正在主队列上运行。因此,第一个addItem()循环在主队列中排队,并且在到达代码末尾之前不会运行。

其他两个块排队到后台队列,可以立即开始运行。

您在后台队列上运行的代码非常简单快捷,可以在第一个块有机会运行之前完成。

在两个背景块之一中添加PlotItem,您将看到“Main”输出更快出现。您的测试会产生误导性结果,因为它简单而且速度太快。