对不起,如果这是一个愚蠢的问题,但我只是想了解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。
答案 0 :(得分:1)
我遇到了与NSTimer类似的问题,将你的计时器添加到mainRunLoop应该修复它。
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("doSomething"), userInfo: nil, repeats: true)
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes)