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

如何在Swift的func_1与func_2执行完成后运行func_3?

实现func_1、func_2完成后再执行func_3的方案

要实现这个需求,核心是让外部能够追踪func_1和func_2的异步执行状态,然后在两者都完成后触发func_3。下面提供两种常用的改造方案:

方案一:将函数改为异步函数(推荐)

原来的func_1和func_2是同步函数,内部悄悄启动Task后立刻返回,外部无法感知执行完成。我们可以把它们改造为异步函数,直接暴露异步接口,这样就能通过await等待执行完成。

改造后的函数代码

// 给函数添加@MainActor,确保执行在主线程(和原代码逻辑一致)
@MainActor
func func_1() async throws {
    let state = try await api.get1State(v!)
    print("cState func_1: \(state!)")
}

@MainActor
func func_2() async throws {
    let state = try await api.get2State(v!)
    print("cState func_2: \(state!)")
}

@MainActor
func func_3() async {
    do {
        let state = try await api.get3State(v!)
        print("cState func_3: \(state!)")
    } catch {
        print("func_3执行出错: \(error)")
    }
}

协调执行的代码

创建一个协调函数,用async let并行启动func_1和func_2,等待两者都完成后再调用func_3:

func runTasksInOrder() async {
    do {
        // 并行启动两个异步任务
        async let task1Result = func_1()
        async let task2Result = func_2()
        
        // 等待两个任务都完成
        _ = try await [task1Result, task2Result]
        
        // 前两个任务完成后,执行func_3
        await func_3()
    } catch {
        print("func_1或func_2执行出错: \(error)")
    }
}

方案二:让函数返回Task对象

如果不想修改原函数的异步接口形式,可以让func_1和func_2返回Task对象,外部通过等待Task完成来实现顺序控制。

改造后的函数代码

func func_1() -> Task<Void, Error> {
    Task { @MainActor in
        let state = try await api.get1State(v!)
        print("cState func_1: \(state!)")
    }
}

func func_2() -> Task<Void, Error> {
    Task { @MainActor in
        let state = try await api.get2State(v!)
        print("cState func_2: \(state!)")
    }
}

// func_3保持原代码不变,或按需改造
func func_3() {
    Task { @MainActor in
        do {
            let state = try await api.get3State(v!)
            print("cState func_3: \(state!)")
        } catch {
            print("func_3执行出错: \(error)")
        }
    }
}

协调执行的代码

func runTasksInOrder() async {
    let task1 = func_1()
    let task2 = func_2()
    
    do {
        // 等待两个Task都完成
        try await Task.wait(for: [task1, task2])
        
        // 执行func_3
        func_3()
    } catch {
        print("func_1或func_2执行出错: \(error)")
    }
}

关键说明

  • 两种方案都默认实现func_1和func_2并行执行(效率更高),如果需要顺序执行func_1→func_2→func_3,只需要把并行逻辑改成连续await即可:
    do {
        try await func_1()
        try await func_2()
        await func_3()
    } catch {
        // 错误处理
    }
    
  • 注意处理异步函数抛出的异常,避免崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:30:43