我曾经遇到过所有类似的问题,但我似乎无法破解。我正在尝试遍历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,但是在所有循环完成之前,它目前不会更新进度条。
答案 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()
希望以上这些对您有帮助。