You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift函数默认是否并行执行?顺序调用时后续函数需等待前置完成吗

同步函数执行顺序问题解答

问题场景

你有一个计算习惯平均养成进度的函数calculateAveragePercentage(),数据量大时会耗时稍久;还有一个依赖averagePercentage值的UI更新函数setCircle()。在viewDidLoad中按顺序调用这两个函数,担心是否会出现setCircle()在前者未完成时就执行的情况。

相关代码如下:

平均进度计算函数

var averagePercentage = 0.0

func calculateAveragePercentage() {
    var percentages: [Double] { habits.map { $0.percentageFormed } }
    if percentages.reduce(0,+) == 0 { averagePercentage = 0.0 }
    else { averagePercentage = Double(percentages.reduce(0,+)) / Double(percentages.count) }
}

单个习惯进度计算逻辑

var percentageFormed: Double {
    let validEntries = entries.filter({ $0.completed })
    if validEntries.count == 0 { return 0.0 }
    else { return Double(validEntries.count) / Double(daysToForm) }
}

控制器调用代码

override func viewDidLoad() {
    calculateAveragePercentage()
    setCircle()
}

核心结论

不会出现并行执行的情况,setCircle()一定会等待calculateAveragePercentage()完全执行完毕后才会开始运行。

原因解释

你写的这些函数都是同步执行的阻塞式函数,没有任何异步操作(比如GCD的async、网络请求、后台任务等)。在主线程的执行流程中,函数调用是按顺序依次执行的:调用calculateAveragePercentage()后,程序会完全执行完这个函数里的所有逻辑(包括遍历所有habits、计算每个percentageFormed、最终算出averagePercentage),才会继续执行下一行的setCircle()。

额外建议

如果数据量极大导致calculateAveragePercentage()耗时过长,会阻塞主线程,造成UI卡顿(比如viewDidLoad完成延迟、界面无法响应)。这种情况下可以把计算逻辑放到后台线程,完成后再回到主线程更新UI,示例如下:

override func viewDidLoad() {
    super.viewDidLoad()
    DispatchQueue.global().async {
        self.calculateAveragePercentage()
        DispatchQueue.main.async {
            self.setCircle()
        }
    }
}

内容的提问来源于stack exchange,提问作者CristianMoisei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:16:09