Swift异步请求执行流程异常:仅createUser函数被调用
Swift异步函数顺序调用问题排查与修复
问题原因分析
- 嵌套函数未执行:在
execute()方法中,你仅定义了嵌套的submit()函数,但从未调用它,导致submitApplication()根本没机会执行。 - 后续方法未触发:
complete()方法从未被调用,ViewController里只调用了execute(),没有触发submitMemorableWord()的执行。 - 标志位控制逻辑无效:依赖
success、submitComplete这类全局变量控制异步流程的方式不合理,即使变量更新,也没有对应的逻辑触发后续异步任务,而且异步环境下全局变量容易引发竞态问题。 - 类名不匹配:ViewController中实例化的是
SimpleUseCase,但你定义的类是UseCase,这会导致编译错误(如未额外定义SimpleUseCase)。
正确实现方式
利用Swift的async/await特性,直接按顺序等待每个异步函数完成,无需额外标志位,天然保证顺序执行:
修复后的UseCase类
import Foundation class UseCase { let repository = Repository() func execute() async throws { // 1. 先执行createUser,成功后再继续 let createUser = try await repository.createUser() print("创建用户成功: \(createUser)") // 2. createUser成功后,执行submitApplication let submitSuccess = try await repository.submitApplication() guard submitSuccess else { throw NSError(domain: "UseCaseError", code: 1, userInfo: [NSLocalizedDescriptionKey: "提交申请失败"]) } print("提交申请成功") // 3. submitApplication成功后,执行submitMemorableWord let memorableWordSuccess = try await repository.submitMemorableWord() guard memorableWordSuccess else { throw NSError(domain: "UseCaseError", code: 2, userInfo: [NSLocalizedDescriptionKey: "提交记忆词失败"]) } print("提交记忆词成功") } }
修复后的ViewController类
import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() Task { await finalResult() } } func finalResult() async { let useCase = UseCase() do { try await useCase.execute() print("所有流程执行完成") } catch { print(error.localizedDescription) } } }
说明
- 利用
async/await的顺序性,每个try await都会等待前一个异步任务完成后才执行下一行代码,天然保证顺序。 - 去掉不必要的全局标志位,改用
guard语句检查每个步骤的结果,失败时直接抛出错误,逻辑更清晰。 - 修正了命名规范问题(函数名小驼峰、类名匹配),符合Swift编码规范。
内容的提问来源于stack exchange,提问作者user21413551
相关产品推荐
相关产品推荐

