进度指示器没有动画

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

我注意到您的并发队列在示例中不是并发的。我假设您使用后台线程一次执行多个任务。如果是这样,在主队列上增加进度也有助于解决竞争条件,因为主队列是串行的,所以所有的进度增量都是一个接一个地执行的。