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
相关产品推荐
相关产品推荐

