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

如何借助SerialExecutor实现TicketSubmission异步方法的串行有序执行?

Swift普通类实现方法调用串行执行方案

针对普通Swift类TicketSubmission多Task调用时执行顺序随机的问题,以下给出两种可行的串行实现方案,其中包含你提到的SerialExecutor协议实现:

方案一:基于SerialExecutor协议实现

1. 自定义串行执行器

实现SerialExecutor协议,借助串行DispatchQueue保证任务按顺序执行:

import Foundation

final class CustomSerialExecutor: SerialExecutor {
    private let serialQueue = DispatchQueue(label: "com.TicketSubmission.SerialQueue")
    
    func enqueue(_ job: consuming ExecutorJob) {
        serialQueue.async {
            job.runSynchronously(on: self)
        }
    }
    
    func asUnownedSerialExecutor() -> UnownedSerialExecutor {
        UnownedSerialExecutor(ordinary: self)
    }
}

2. 修改TicketSubmission类

给类添加自定义串行执行器属性,在submitTicket方法中指定任务使用该执行器:

class TicketSubmission {
    private let serialExecutor = CustomSerialExecutor()
    
    func submitTicket(ticketId: String) async {
        await Task(executor: serialExecutor) {
            // 这里写入原submitTicket的业务逻辑,示例模拟耗时操作
            print("开始提交工单:\(ticketId)")
            try? await Task.sleep(nanoseconds: 1_000_000_000)
            print("完成提交工单:\(ticketId)")
        }.value
    }
}

方案二:基于DispatchQueue串行队列实现

如果不需要依赖SerialExecutor,可以直接用串行DispatchQueue包装任务,实现更简洁:

class TicketSubmission {
    private let serialQueue = DispatchQueue(label: "com.TicketSubmission.SerialQueue")
    
    func submitTicket(ticketId: String) async {
        await withCheckedContinuation { continuation in
            serialQueue.async {
                // 原业务逻辑
                print("开始提交工单:\(ticketId)")
                Thread.sleep(forTimeInterval: 1) // 模拟耗时
                print("完成提交工单:\(ticketId)")
                continuation.resume()
            }
        }
    }
}

测试验证

使用你提供的调用代码测试,无论多少个Task调用,submitTicket都会按调用顺序串行执行:

let submission = TicketSubmission()

Task {
    await submission.submitTicket(ticketId: "1")
}

Task {
    await submission.submitTicket(ticketId: "2")
}

Task {
    await submission.submitTicket(ticketId: "3")
}

输出结果会严格按照1→2→3的顺序完成工单提交。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:10:15