任务管理器 - Swift 并发

概述

swift-concurrency 支持结构化并发,但也支持使用 Task API 进行非结构化并发。Task API 会立即运行其工作项。虽然使用闭包可以创建延迟任务。

任务管理器接受要按键值隔离的串行队列中运行的工作项。
传递键和模式(丢弃当前项 / 等待当前项完成)

用法

enum MyTask: TaskKeyType {}

let manager = TaskManager()

// this `await` is just for appending task item since TaskManager is Actor.
let ref = await manager.task(key: .init(MyTask.self), mode: .dropCurrent) {
  // work
}

// to wait the completion of the task, use `ref.value`.
await ref.value

用例

切换用户状态 想象一下社交服务——切换用户状态,比如是否收藏。对于客户端来说,它需要分发异步请求。在某些情况下,如果客户端分发多个切换请求(比如用户连续点击更新按钮),最终用户状态可能与客户端预期的不同。

enum SomeRequestKey: TaskKeyType {}

let key = TaskKey(SomeRequestKey.self).combined(targetUserID)

await taskManager.task(key: key, mode: .dropCurrent) { ... }

为了避免这种情况,客户端在队列中启动新请求之前,会停止当前请求。
上面的例子将请求与类型化的请求键和目标用户标识符绑定,从而为该用户创建一个队列。