通过委托更新 UIProgressView 进度
Update UIProgressView progress via delegate
所以我的 UIProgressView 有这个奇怪的问题。我 运行 通过 Alamofire 的后台任务通过自定义 api 获取一些对象。每次获取一组对象时,我都想通过该 progressView 显示它。但是,进度指示器不会沿着指定的进度移动,而是在整个进度完成后才会一次性跳到 100%。进度通过委托从另一个 class 的后台传输,并在日志打印中正确显示。但是 progressView 没有移动。
它被触发:
delegate?.updateProgressF?(progressText: "Some Text", progress: 0.1)
以及函数:
func updateProgressF(progressText: String, progress: CGFloat) {
let date = Date()
let calendar = Calendar.current
let seconds = calendar.component(.second, from: date)
let nanoSeconds = calendar.component(.nanosecond, from: date)
print(progress, seconds, nanoSeconds, progressView.progress)
DispatchQueue.main.async { [self] in
progressView.setProgress(Float(progress), animated: true)
}
}
它打印:
0.1 23 123411059 0.0
0.2 28 800351977 0.0
0.4 28 804774999 0.0
0.6 28 806638002 0.0
0.8 28 885470032 0.0
0.9 32 190487980 0.0
1.0 32 253463029 0.9
非常感谢任何建议
我明白了。因此,对于将来遇到类似问题的任何人,只需确保所有任务都在后台 运行,然后在主线程上调用 progressView。在我的例子中,我必须在我的 viewDidLoad:
中指定
DispatchQueue.global(qos: .background).async {[self] in
fetchInfo()
}
然后在主线程上调用UI更改:
DispatchQueue.main.async { [self] in
progressView.setProgress(Float(progress), animated: true)
}
所以我的 UIProgressView 有这个奇怪的问题。我 运行 通过 Alamofire 的后台任务通过自定义 api 获取一些对象。每次获取一组对象时,我都想通过该 progressView 显示它。但是,进度指示器不会沿着指定的进度移动,而是在整个进度完成后才会一次性跳到 100%。进度通过委托从另一个 class 的后台传输,并在日志打印中正确显示。但是 progressView 没有移动。
它被触发:
delegate?.updateProgressF?(progressText: "Some Text", progress: 0.1)
以及函数:
func updateProgressF(progressText: String, progress: CGFloat) {
let date = Date()
let calendar = Calendar.current
let seconds = calendar.component(.second, from: date)
let nanoSeconds = calendar.component(.nanosecond, from: date)
print(progress, seconds, nanoSeconds, progressView.progress)
DispatchQueue.main.async { [self] in
progressView.setProgress(Float(progress), animated: true)
}
}
它打印:
0.1 23 123411059 0.0
0.2 28 800351977 0.0
0.4 28 804774999 0.0
0.6 28 806638002 0.0
0.8 28 885470032 0.0
0.9 32 190487980 0.0
1.0 32 253463029 0.9
非常感谢任何建议
我明白了。因此,对于将来遇到类似问题的任何人,只需确保所有任务都在后台 运行,然后在主线程上调用 progressView。在我的例子中,我必须在我的 viewDidLoad:
中指定DispatchQueue.global(qos: .background).async {[self] in
fetchInfo()
}
然后在主线程上调用UI更改:
DispatchQueue.main.async { [self] in
progressView.setProgress(Float(progress), animated: true)
}