Почему этот код Timer / RunLoop работает? Это не должно - PullRequest
0 голосов
/ 08 марта 2019
class A: Timer {
    var myTimer: Timer!
}

class TimerTestViewController: UIViewController {
    var a = A()

    override func viewDidLoad() {
        super.viewDidLoad()
        a.myTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerRun), userInfo: nil, repeats: true)
        RunLoop.current.add(a, forMode: RunLoop.Mode.common)

        a.myTimer.fire()
    }
}

Обратите внимание на RunLoop.current.add(a, forMode: .common), что я не добавил a.myTimer в runloop, но «случайно» добавил a в runloop.

почему этот код работает вообще?

1 Ответ

3 голосов
/ 08 марта 2019

scheduledTimer уже добавил Timer к RunLoop, и поэтому следующая строка даже не нужна.

См. Timer.scheduledTimer(timeInterval:target:selector:userInfo:repeats:)

Создает таймер и планирует его в текущем цикле выполнения в режиме по умолчанию.

Вторая строка проходит с a только потому, что вы объявили A как Timer, что, вероятно, является ошибкой:

// A should not be a Timer!
class A: Timer {
...