gpt4 book ai didi

ios - 并发(dispatchqueue)测试未按预期进行 ios/swift

转载 作者:行者123 更新时间:2023-11-30 11:38:59 25 4
gpt4 key购买 nike

所以我在 Swift 4 Playground 中有这段代码:

//: 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

我现在的问题是:后台队列不应该在“代码结束”之前打印出来吗?如果最后两个 block 已入队并立即开始执行,为什么它们不打印之前出来过?是因为主队列优先级更高吗?但它不应该异步运行吗?

最佳答案

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

另外两个 block 被排入后台队列并可以立即开始运行。

您在后台队列上运行的代码是如此简单和快速,以至于它恰好在第一个 block 有机会运行之前完成。

在两个背景 block 之一内添加一个sleep,您将看到“Main”输出更快地出现。您的测试给出了误导性的结果,因为它太简单而且太快。

关于ios - 并发(dispatchqueue)测试未按预期进行 ios/swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49442942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com