【问题标题】:Progress bar won't update when looping a lot循环很多时进度条不会更新
【发布时间】:2017-01-14 13:23:09
【问题描述】:

我有一个进度条,应该在每一步后更新。步数可能非常高,比如说 50.000。当输入这个大数字时,iPhone 正在计算时进度条不做任何事情。当 iPhone 完成时,进度条立即处于 1.0(最大)进度。这是我的代码:

    for x in 1...timesToSimulate{
        var progress: Float = Float(x) / Float(timesToStimulate)
        progressBarView.setProgress(progress, animated: true)
}

计算并不难,但我做错了什么但看不到什么。你知道它是什么吗?

【问题讨论】:

  • 你是在主线程上做这个吗?
  • 我不知道是什么线程,我从来没有修改过线程上的任何东西。只是我猜的普通线程
  • 可能它正在更新,但它会立即发生,因此您可能看不到更改。如果您想每秒更新进度条,请考虑使用 NSTimer。

标签: swift progress-bar


【解决方案1】:

原因可能是您所有的计算都是在主踏板上完成的。 UI 仅在您的函数返回后更新(此时您已达到最大进度)。如果要逐步更新进度条,则需要异步更改进度。

例如:

    for x in 1...timesToSimulate{
        let progress: Float = Float(x) / Float(timesToSimulate)
        DispatchQueue.main.asyncAfter(deadline: .now() + Double(x) * 0.1) {
            self.progressBarView.setProgress(progress, animated: true)
        }
    }

【讨论】:

  • 将代码更改为您的答案时,问题仍然完全相同:(
  • 您确定没有在代码的其他任何地方设置进度吗?我发布的代码对我来说非常好......
  • 奇怪的是,DispatchQueue后面的代码不会执行。进度条没有做任何事情......我将我的代码清空到你的代码行。它不会执行。当我尝试做 print("??") 打印不会显示。但是,该函数肯定会被调用。我不知道该怎么办。
  • 不!示例: func executeRandomize(timesToStimulate: Int) { print("1") for x in 1...timesToStimulate{ print("2") let progress: Float = Float(x) / Float(timesToStimulate) DispatchQueue.main.asyncAfter (deadline: .now() + Double(x) * 0.1) { print("3") self.progressBarView.setProgress(progress, animated: true) } } }
  • 如果在主线程上调用此代码,此示例仍然无法运行。尝试将整个块包装在 DispatchQueue.global().async { ... } 调用中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多