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

时间:2016-03-11 15:44:42

标签: ios swift multithreading uitableview grand-central-dispatch

对不起,如果这是一个愚蠢的问题,但我只是想了解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

1 个答案:

答案 0 :(得分:1)

我遇到了与NSTimer类似的问题,将你的计时器添加到mainRunLoop应该修复它。

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