进度指示器不具有动画效果

时间:2016-01-08 02:07:12

标签: swift macos swift2 cocoa-bindings

我设置了一个标签和一个进度指示器来绑定到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)
        }
    }
}

2 个答案:

答案 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)
}