Таймер продолжает работать после invalidate () и nil - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть этот таймер:

class InstallationViewController: BaseViewController {

   var precentageTimer: Timer!
}

В том же классе я запускаю таймер примерно так:

               self.precentageTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { (timer) in
                self.network.getClibrationPercentage(success: { (info, percent) in
                    self.isAnalysisCompleted(percent: percent)
                    self.precentageLbl.text = "\(percent)%"
                    self.instructionsLbl.text = info
                    self.precentageLbl.isHidden = false
                }, failure: { (error) in
                    print(error)
                })
            })

У меня также есть этот метод для увольнения задач:

 func dissmissAllTasks() {
    NotificationCenter.default.removeObserver(self)
    self.setCalibrationEnableTimer?.invalidate()
    self.setCalibrationEnableTimer = nil
    self.snapShotTimer?.invalidate()
    self.snapShotTimer = nil
    self.precentageTimer?.invalidate()
    self.precentageTimer = nil
}

Это происходит, когда я перехожу через viewWillDisappear следующим образом:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    dissmissAllTasks()
 }

Но когда я иду в другой VC, я вижу, что этот таймер продолжает работать.Я проверил вызов функции dismissAllTasks () и вижу, что таймер равен нулю.

Почему таймер продолжает работать?

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вы почти наверняка присваиваете precentageTimer дважды, не делая его недействительным.Это очень распространенная ошибка.Функция, включающая self.precentageTimer =, вероятно, вызывается несколько раз, прежде чем вызывается viewWillDisappear.Поскольку вы привязали его к нажатию кнопки, это может произойти, если кнопка будет нажата дважды.

Обычное решение - добавить willSet к percentageTimer, как это (а вам не нужно percentageTimerбыть !; это абсолютно должно быть ?, поскольку оно может быть на законном основании ноль):

var precentageTimer: Timer? {
    willSet {
        percentageTimer?.invalidate()
    }
}
0 голосов
/ 03 декабря 2018

Убедитесь, что вы создали и аннулировали таймер в том же потоке.

Также у вас есть self, захваченный с сильной ссылкой в ​​закрытии, поэтому я считаю, что ссылка на ваш таймер все еще жива.Вы получаете что-то с сервера за 0,1 секунды с повторениями, и все ваши запросы, похоже, тоже живы.

...