进度指示器没有动画
Progress Indicator does not animate
我设置了一个标签和一个进度指示器来绑定到 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)
}
}
}
对 UI 的更改应该在主线程上更新。您应该将更新进度移至主线程。
dispatch_async(dispatch_get_main_queue()) {
self.updateProgress(sender)
}
根据我的经验,从后台队列更新绑定变量有时会导致有趣的行为。进度指示器不更新就是一个例子。不过,我还没有弄清楚 "why" 部分。我的解决方法是在后台队列上完成您的工作,但更新主队列上的绑定变量。
试试这个(未测试):
@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)
}
}
我注意到您的并发队列在示例中不是并发的。我假设您使用后台线程一次执行多个任务。如果是这样,在主队列上增加进度也有助于解决竞争条件,因为主队列是串行的,所以所有的进度增量都是一个接一个地执行的。
我设置了一个标签和一个进度指示器来绑定到 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)
}
}
}
对 UI 的更改应该在主线程上更新。您应该将更新进度移至主线程。
dispatch_async(dispatch_get_main_queue()) {
self.updateProgress(sender)
}
根据我的经验,从后台队列更新绑定变量有时会导致有趣的行为。进度指示器不更新就是一个例子。不过,我还没有弄清楚 "why" 部分。我的解决方法是在后台队列上完成您的工作,但更新主队列上的绑定变量。
试试这个(未测试):
@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)
}
}
我注意到您的并发队列在示例中不是并发的。我假设您使用后台线程一次执行多个任务。如果是这样,在主队列上增加进度也有助于解决竞争条件,因为主队列是串行的,所以所有的进度增量都是一个接一个地执行的。