iOS:自定义单元格上的NSRunLoop

时间:2015-11-11 17:48:54

标签: ios objective-c uitableview nsrunloop

我在自定义单元格上运行NSRunLoop NSTimer,以便不断更新"有效期至" UILabel。它工作正常,直到我关闭tableView,NSRunLoop继续倒计时。我使用dealloc,但似乎没有排除NSRunLoopNSTimer

-(void)dealloc {

    [[NSNotificationCenter defaultCenter]removeObserver:self];
    [_timer invalidate];
    CFRunLoopStop(CFRunLoopGetCurrent());
    _runner = nil; // NSRunLoop
}

当细胞被释放时,如何杀死NSRunLoop?提前谢谢。

1 个答案:

答案 0 :(得分:2)

使用当前运行循环解决问题会让您遇到各种麻烦。解决问题的最简单方法是在您的单元格上设置NSTimer属性,并在单元格willDisplay / willEndDisplay时启动/停止该属性。

class CustomCell: UITableViewCell {

    var timer: NSTimer?

    func startTimer() -> Void {
        timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateUI:", userInfo: nil, repeats: true)
    }

    func stopTimer() -> Void {
        timer?.invalidate()
        timer = nil
    }

    func updateUI(sender: NSTimer?) -> Void {
        // update your label here
    }

}

class ViewController: UIViewController, UITableViewDelegate {

    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if let cell = cell as? CustomCell {
            cell.startTimer()
        }
    }

    func tableView(tableView: UITableView, didEndDisplayingCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        if let cell = cell as? CustomCell {
            cell.stopTimer()
        }
    }

}