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

07-28 05:55