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