gpt4 book ai didi

ios - 为什么在延迟调用时循环迭代有时会被打乱? [代码和输出]

转载 作者:行者123 更新时间:2023-11-28 12:34:46 25 4
gpt4 key购买 nike

我正在使用 swift 3 来制作延迟事件,这是代码

public func delay(bySeconds seconds: Double, dispatchLevel: DispatchLevel = .main, closure: @escaping () -> Void)
{
let dispatchTime = DispatchTime.now() + seconds
dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)
}

public enum DispatchLevel
{
case main, userInteractive, userInitiated, utility, background
var dispatchQueue: DispatchQueue
{
switch self
{
case .main: return DispatchQueue.main
case .userInteractive: return DispatchQueue.global(qos: .userInteractive)
case .userInitiated: return DispatchQueue.global(qos: .userInitiated)
case .utility: return DispatchQueue.global(qos: .utility)
case .background: return DispatchQueue.global(qos: .background)
}
}
}



override func viewDidAppear(_ animated: Bool)
{

}

override func viewDidLoad()
{
super.viewDidLoad()

for i in 0..<20
{
delay(bySeconds: 1.0+Double(i)*0.5, dispatchLevel: .background)
{
print("__ \(i)")
// delayed code that will run on background thread
}
}

}

实际输出,注意10后pattern的变化

__ 0
__ 1
__ 2
__ 3
__ 4
__ 5
__ 6
__ 7
__ 8
__ 9
__ 10
__ 12
__ 11
__ 14
__ 13
__ 16
__ 15
__ 17
__ 18
__ 19

预期输出

__ 0
__ 1
__ 2
__ 3
__ 4
__ 5
__ 6
__ 7
__ 8
__ 9
__ 10
__ 11
__ 12
__ 13
__ 14
__ 15
__ 16
__ 17
__ 18
__ 19

延迟扩展有问题吗?

最佳答案

关键响应是您正在使用异步函数和 concurent-queue(background) 。

dispatchLevel.dispatchQueue.asyncAfter(deadline: dispatchTime, execute: closure)

上面的代码将立即返回,它只是将任务设置为在未来的时间执行,因此您的 delay 函数也会立即返回。因此,这不会阻止循环进入下一个(与 sycn 函数相符)。

另一方面,后台队列是一个并发队列,这意味着没有grantee任务将按照添加队列的相同顺序完成执行,这解释了你得到的结果。

相比之下,如果您使用主队列,因为它是一个串行队列,那么可以保证它按照添加的顺序一个接一个地执行和完成。但您将阻止应用程序的 UI/响应能力

关于ios - 为什么在延迟调用时循环迭代有时会被打乱? [代码和输出],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41195959/

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