iOS QOS_CLASS_USER_INITIATED 在与 UI (Swift) 交互时冻结

iOS QOS_CLASS_USER_INITIATED freezes while interacting with UI (Swift)

对不起,如果这是一个愚蠢的问题,但我只是想了解 GCD。

我尝试做一件简单的事情:UITableViewController 在单元格上有一个 UITableViewCell 和 UIProgressView。这个 progressView 应该每秒更新一次。

cellForRowAtIndexPatch中我做了这个

let cell = tableView.dequeueReusableCellWithIdentifier("onlyCell", forIndexPath: indexPath) as! OnlyTableViewCell
cell.runChanges()
return cell

runChanges 函数中我只是创建了定时器

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("doSomething"), userInfo: nil, repeats: true)

并且 doSomething 看起来像这样:

func doSomething() {
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue),0)) {

        if self.i >= 100 {
            self.timer!.invalidate()
            return
        }
        ++self.i
        dispatch_async(dispatch_get_main_queue()) {
            self.prgrs.progress = Float(self.i)/100.0
            print(self.i)
        }
    }
}

所以我认为它会一直工作,而我(也许)与 UI 互动。当我不碰它时,它工作得很好。但是当我与 UI 交互时,例如,滚动 UITableView 并将我的手指(模拟器中的鼠标)放在屏幕上,它会冻结。 我想如果现在是 22%,我会滚动它并按住我的手指 10 秒,它可能应该从大约 32% 继续,但它显示 23%。

对不起我的英语和愚蠢。

图片和来源here

我对 NSTimer 有类似的问题,将你的计时器添加到 mainRunLoop 应该可以解决它。

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("doSomething"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)