请问,如果这是一个愚蠢的问题,但我只是想了解GCD。
我试图做一件简单的事情:在单元格上带有一个UITableViewCell和UIProgressView的UITableViewController。而且该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)