【问题标题】:Can a Swift Concurrency Task be stored in a queue and started later?可以将 Swift 并发任务存储在队列中并稍后启动吗?
【发布时间】:2021-12-03 00:18:31
【问题描述】:

我需要推迟一个任务的执行,直到我完成一个高优先级任务,例如重新认证,然后从那里执行原始任务。我正在尝试为此使用 Swift Concurrency 的 Task 对象:

Task {
    await service.fetch(...)
}

我知道我可以cancel 任务,但我想稍后停止/启动它。我正在考虑将其存储在队列中,并在高优先级任务完成后将队列刷新。这可以用 Swift Concurrency 来完成吗,或者我希望我不必用 async/await 或类似的东西来包装 Operation 对象?

【问题讨论】:

    标签: swift task swift-concurrency


    【解决方案1】:

    来自 WWDC 2021 视频“Swift 并发:幕后”,任务安排代码在未来执行,但无法让您对该任务的执行时间进行太多控制。特别是,即使您可以为任务提供优先级,但在某些情况下,您仍可能在任务执行顺序中出现优先级倒置。

    对于您想要的控制类型,您最好的选择是使用 Grand Central Dispatch,并将高优先级和低优先级队列输入串行调度队列,然后您可以将任务放入适当的队列中。

    编辑:我刚刚看到一个对我来说很新的构造(自从我每天使用 GCD 以来已经有一段时间了)。它被称为 Workloop (https://developer.apple.com/documentation/dispatch/workloop),听起来它可能只是一张票,无需手动将调度队列捆绑在一起。

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      相关资源
      最近更新 更多