为什么递归Dispatch.main.async花费的时间越来越长?

问题描述 投票:0回答:1

所以我在 SwiftUI 中有这个递归函数。在最新型号的 iPhone 上,每次迭代平均需要 50 毫秒。整个过程需要一分钟左右的时间。当用户启动它时,他预计会发生这种情况,并且在达到退出条件并完成之前在应用程序中没有其他事情可做。但当然,我希望它尽快完成,并且我希望用户在变得不耐烦时能够尽早中止它。此外,在每次迭代之后,它都会更新折线图以向用户显示其进度。为了提高速度,我在主线程上运行它,如下所示:

.onChange(of: kickItOff) { value in
    recursiveFunction()
}

func recursiveFunction() {
    Dispatch.main.async() {
        step1()
        step2()
        step3()
        if !exit {
            recursiveFunction()
        }
    }
}

迭代中的每个步骤以及迭代本身必须串行执行。

运行速度快,并且 UI 不会被阻塞。只有一个问题。 每次开始时,完成的时间都会越来越长。第四次运行所需的时间是第一次的两倍。

我用路标工具对其进行了分析,可以看到递归函数中的每个步骤都不会改变迭代之间的持续时间。迭代之间的时间间隔在增加。

有人知道为什么会发生这种情况并希望有解决方案吗?

recursion swiftui dispatch
1个回答
0
投票

DispatchQueue.main是一个串行队列。异步调用永远不会返回,并且 recursiveFunction 有效地阻塞了主队列。如果您随后在主队列上设置退出,则永远不会执行。

© www.soinside.com 2019 - 2024. All rights reserved.