如何借助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
相关产品推荐
相关产品推荐

