gpt4 book ai didi

ios - 并发队列问题 - iOS/Swift

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:25:07 24 4
gpt4 key购买 nike

在我的程序中,我需要两个任务在后台同时运行。为此,我使用了如下的并发队列,

let concurrentQueue = DispatchQueue(label: "concurrentQueue", qos: .utility, attributes: .concurrent)

concurrentQueue.async {
for i in 0 ..< 10{
print(i)
}
}

concurrentQueue.async {
for i in (0 ..< 10).reversed(){
print(i)
}
}

这里我需要这样的输出,

0
9
1
8
2
7
3
6
4
5
5
4
6
3
7
2
8
1
9
0

但我得到的是,

enter image description here

我引用了下面的教程,以便对 Swift 3 中的并发队列有一些基本了解
https://www.appcoda.com/grand-central-dispatch/

有人能告诉我我的代码有什么问题吗?否则这是我应该得到的结果吗?还有其他方法可以完成我的工作吗?任何帮助将不胜感激。

最佳答案

您的代码示例没有任何问题。这是将两个任务提交到并发队列的正确语法。

问题在于您一定会看到它们同时运行。有两个问题可能会对此产生影响:

  1. 第一个分派(dispatch)的任务可以运行得如此之快,以至于它恰好在第二个任务开始之前完成。如果你放慢他们的速度,你会看到你的并发行为:

    let concurrentQueue = DispatchQueue(label: Bundle.main.bundleIdentifier! + ".concurrentQueue", qos: .utility, attributes: .concurrent)

    concurrentQueue.async {
    for i in 0 ..< 10 {
    print("forward: ", i)
    Thread.sleep(forTimeInterval: 0.1)
    }
    }

    concurrentQueue.async {
    for i in (0 ..< 10).reversed() {
    print("reversed:", i)
    Thread.sleep(forTimeInterval: 0.1)
    }
    }

    您永远不会在生产代码中 sleep ,但出于教学目的,它可以更好地说明问题。

    您也可以省略 sleep 调用,只需大幅增加数字(例如 1_00010_000),您可能会开始查看正在发生的并发处理。

  2. 您的设备可能受资源限制,无法同时运行代码。设备具有有限数量的 CPU 内核来运行并发任务。仅仅因为您将任务提交到并发队列,并不意味着设备能够同时运行这两个任务。这取决于硬件以及该设备上运行的其他内容。

    顺便说一句,请注意,您可能会在模拟器(使用 Mac 的 CPU,它可能正在运行许多其他任务)上看到与在设备上不同的行为。如果您尚未在实际设备上测试此行为,您可能需要确保进行测试。


另请注意,您说您“需要”输出以在两个队列之间交替使用 print 语句。虽然教程中的屏幕快照表明这应该是预期的,但您绝对不能保证会是这种情况。

如果你真的需要它们来回交替,你必须添加一些机制来协调它们。您可以使用信号量(我不愿意推荐,因为它们是问题的常见来源,尤其是对于新开发人员而言)或具有依赖性的操作队列。

关于ios - 并发队列问题 - iOS/Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46410935/

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