进度栏不会从for循环中更新

时间:2019-08-01 20:56:30

标签: ios swift loops for-loop progress-bar

我曾经遇到过所有类似的问题,但我似乎无法破解。我正在尝试遍历xcode项目中的10次迭代循环,并每次将进度条更新10%。

尽管我尝试使用DispatchQueue,进度条似乎直到最后都没有更新。

@IBOutlet weak var signingBar: UIProgressView!
@IBOutlet weak var contButton: UIButton!
@IBAction func goButton(_ sender: UIButton) {

        DispatchQueue.global(qos: .utility).async {
            for i in 1...10 {

                // run function x times
                runSignings(iterations: 1)

                DispatchQueue.main.async {
                    // now update UI on main thread
                    self.signingBar.setProgress(Float(i/10), animated: true)

                    if i == 10 {
                        self.contButton.isHidden = false
                    }
                    else {
                        self.contButton.isHidden = true
                    }
                }
            }
        }
    }

我希望这可以在每个for循环的末尾运行我的函数并更新UI,但是在所有循环完成之前,它目前不会更新进度条。

1 个答案:

答案 0 :(得分:0)

似乎Float(i/10)应该更改为Float(i)/10,因为前一个用两个整数进行除法,然后转换为浮点数,它将始终返回0,直到i达到10。 / p>

此外,如果我正确理解了您的问题,则希望与每个步骤i同步更新进度。

因为您正在使用DispatchQueue.main.async在主线程中异步更新signingBar,所以for循环仍将继续,但不会被self.signingBar.setProgress阻止。

>

如果您想确定signingBar的更新步骤,可以使用DispatchGroup等到进度条更新。

// At each 'i' step

let group = DispatchGroup()
group.enter()

// run function x times
runSignings(iterations: 1)

DispatchQueue.main.async {
    // now update UI on main thread
    self.signingBar.setProgress(Float(i)/10, animated: true)

    group.leave()
}

group.wait()

希望以上这些对您有帮助。