2016-12-23 3 views
5

Я пытался использовать таймер в Swift и я упростил его город к следующему:Swift 3 Таймер не стреляя

func startTimer() { 
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.test), userInfo: nil, repeats: true) 
} 
func test() { 
    print("FIRED") 
} 

Я хотел бы назвать это из другой функции и проверили StartTimer функция работает, но таймер не срабатывает. Связано ли это с RunLoop? Я довольно новичок в кодировании, поэтому любое объяснение будет оценено.

+0

Is 'ViewController' ==' self'? – vadian

+0

Из фрагмента кода, я предполагаю, что он должен быть запущен, так что уверены в 'startTimer()' был вызван, правильно? и, очевидно, ваш класс под названием «ViewController» –

+0

Добавьте инструкцию печати внутри startTimer, чтобы убедиться, что она вызывается. –

ответ

12

Хорошая практика: В startTimer() убедитесь, что таймер еще не создан и не выполняет задание. В stopTimer() убедитесь, что таймер существует до вызова invalidate и установите таймер на нуль.

Кроме того, для вашего селектора убедитесь, что у вас есть префикс @obj. Вы должны иметь возможность получить рабочий таймер с предоставленным кодом. Счастливое кодирование!

class SomeClass { 
    var timer: Timer? 

    func startTimer() { 
     guard timer == nil else { return } 
     timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(test), userInfo: nil, repeats: true) 
    } 

    func stopTimer() { 
     guard timer != nil else { return } 
     timer?.invalidate() 
     timer = nil 
    } 

    @objc func test() { 

    } 
} 
+0

Последнее, я не думаю, что в вашем параметре выбора требуется ViewController.test, тест должен работать нормально. –

+0

Почему проверяет, не имеет ли значение его значение до того, как вы установите его на nil –

+0

Это предотвращает вызов invalidate() для потенциально нулевого объекта. Например, скажем, вы вызываете stopTimer() в нескольких функциях. Он срабатывает один раз, делает недействительным таймер и возвращается к нулю. Если stopTimer() вызывается снова подряд, без повторной инициализации таймера, вы получите фатальную ошибку. Это связано с тем, что таймер уже освобожден. Оба предупреждающих сообщения находятся на месте, чтобы продолжать и останавливать таймер в синхронизации. –

Смежные вопросы