Swift中如何控制异步函数执行顺序:串行+并行+串行
解决方案
你的核心需求是让loadMyLikes()和loadMyAdmirers()在loadMyData()完成后并行执行,Swift的结构化并发(async/await)已经能完美处理这个场景,不需要用完成处理程序。修改后的代码如下:
func initializeMe() { Task { // 先确保用户基础数据加载完成,后续两个任务依赖此数据 await loadMyData() // 用async let同时启动两个异步任务,实现并行执行 async let loadLikes = loadMyLikes() async let loadAdmirers = loadMyAdmirers() // 等待两个并行任务全部完成 _ = await (loadLikes, loadAdmirers) // 两个任务都完成后,执行好友查找逻辑 loadMyFriends() } }
代码说明
- 串行执行
loadMyData():必须先await这个函数,因为loadMyLikes()依赖它加载的likes数组,loadMyAdmirers()也需要当前用户ID(来自loadMyData()的结果)。 - 并行启动两个任务:
async let会立即启动对应的异步函数,两个任务会在后台同时执行,不用等其中一个完成再启动另一个,大幅节省等待时间。 - 等待并行任务完成:
await (loadLikes, loadAdmirers)会阻塞当前Task,直到两个任务都执行完毕,确保myLikes和myAdmirers的数据都已准备好,再执行loadMyFriends()。
补充细节
如果loadMyLikes()和loadMyAdmirers()会返回结果(比如直接返回用户数组),你也可以直接捕获返回值:
func initializeMe() { Task { await loadMyData() async let myLikes = loadMyLikes() async let myAdmirers = loadMyAdmirers() // 获取两个任务的返回结果 let (likesList, admirersList) = await (myLikes, myAdmirers) // 可以直接用返回的结果调用loadMyFriends,比如: loadMyFriends(from: likesList, and: admirersList) } }
相比完成处理程序,async/await的写法更直观,避免了嵌套回调的“回调地狱”,代码可读性和可维护性更强。
内容的提问来源于stack exchange,提问作者CeilingTiles
相关产品推荐
相关产品推荐

