在异步任务中更新 cli 进度条

Update cli progress bar in async Task

我有一个 Swift cli 应用程序,其中使用了异步 Task。我想根据任务的进度显示进度条。我正在为酒吧使用 Progress.swift 包。

我的代码是这样的。

var bar = ProgressBar(count: 100)

let waiter = Task {
    do {
        for try await output in session.outputs {
            switch output {
                case .requestProgress(let request, let fractionComplete):
                    bar.setValue(Int(fractionComplete * 100))
            }
        }
    } catch {
        logger.error("Output: ERROR = \(String(describing: error))")
        Foundation.exit(0)
    }
}

我现在的问题是 bar.setValue()

出现以下错误

Mutation of captured var 'bar' in concurrently-executing code.

我对 swift 很陌生,所以请多多包涵。

我确实理解错误消息,但我如何解决这个问题并获取进度以更新我的栏?

解决方案是使用这样的 actor 实例,

actor Bar {
   var progressBar = ProgressBar(count: 100)
   func setValue(_ value: Int) {
       progressBar.setValue(value)
   }
}
        
let bar = Bar()

然后在任务中。

await bar.setValue(Int(fractionComplete * 100))

基于this答案。