【问题标题】:Update cli progress bar in async Task在异步任务中更新 cli 进度条
【发布时间】:2021-11-23 17:46:43
【问题描述】:

我有一个 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 很陌生,所以请多多包涵。

我确实理解错误消息,但我该如何解决这个问题并捕捉到更新我的栏的进度?

【问题讨论】:

    标签: swift command-line-interface task progress-bar


    【解决方案1】:

    解决方案是使用这样的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 anwser。

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多