2015-11-11 1 views
0

Я запускаю NSRunLoop с помощью NSTimer на пользовательской ячейке, чтобы постоянно обновлять «Действительный до» UILabel. Он отлично работает, пока я не закрываю tableView, NSRunLoop продолжает отсчет времени. Я использую dealloc, но кажется, что он не сбрасывает NSRunLoop и NSTimer.iOS: NSRunLoop на пользовательской ячейке

-(void)dealloc { 

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

Как я могу убить NSRunLoop, когда клетка освобождается? Заранее спасибо.

+2

Я не стал бы _dare_ использовать NSRunLoop таким образом. Вы просто просите о неприятностях. – gnasher729

+0

Мое голосование за это заявление. – NCFUSN

ответ

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() 
     } 
    } 

}