我设置了一个标签和一个进度指示器来绑定到AppDelegate的progress
属性。然后,我在并发队列上执行工作。随着每项任务的完成,我将进度提高1。
我的问题是标签按预期逐个更新,但进度指示器没有。它每15个滴答左右更新一次。知道如何使进度指示器随每个滴答移动吗?
简化示例:
class AppDelegate: NSObject, NSApplicationDelegate {
dynamic var progress = 0
@IBAction func updateProgress(sender : AnyObject) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
guard self.progress < 100 else {
return
}
self.progress += 1
sleep(1)
self.updateProgress(sender)
}
}
}
答案 0 :(得分:1)
根据我的经验,从后台队列更新绑定变量有时会导致有趣的行为。进度指示器未更新就是一个例子。我没想出“为什么”的部分。我的解决方法是在后台队列上完成工作,但更新主队列上的绑定变量。
试试这个(未经测试):
@IBAction func updateProgress(sender : AnyObject) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
guard self.progress < 100 else {
return
}
dispatch_async(dispatch_get_main_queue()) {
self.progress += 1
}
sleep(1)
self.updateProgress(sender)
}
}
我注意到你的并发队列在示例中只是并发的。我假设您使用后台线程一次执行多个任务。如果是这样,增加主队列的进度也有助于竞争条件,因为主队列是串行队列,因此所有进度增量都是逐个执行的。
答案 1 :(得分:0)
UI的更改应该在主线程上更新。您应该将更新进度移动到主线程。
dispatch_async(dispatch_get_main_queue()) {
self.updateProgress(sender)
}