2016-12-23 22 views
5

Próbowałem wykorzystać timer w Swift i ja go uprościć miasto na następujący:Swift 3 czasowy nie wypalanie

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

chciałbym nazwać to z innej funkcji i zweryfikowaniu startTimer funkcja działa, ale timer się nie uruchamia. Czy ma to coś wspólnego z RunLoop? Jestem całkiem nowy w kodowaniu, więc wszelkie wyjaśnienia byłyby mile widziane.

+0

Czy 'ViewController' ==' self'? – vadian

+0

Z fragmentu kodu zakładam, że powinien zostać uruchomiony, więc jesteś pewien, że 'startTimer()' został wywołany, prawda? i - oczywiście - twoja klasa o nazwie "ViewController" –

+0

Dodaj instrukcję print wewnątrz startTimer, aby upewnić się, że jest wywoływana. –

Odpowiedz

12

Dobra praktyka: w startTimer() sprawdź, czy timer nie został jeszcze utworzony i wykonaj zadanie. W stopTimer() sprawdź, czy licznik istnieje przed wywołaniem unieważnienia, i ustaw timer ponownie na zero.

Ponadto dla selektora upewnij się, że masz przedrostek @obj. Powinieneś być w stanie uzyskać działający zegar z dostarczonym kodem. Szczęśliwe kodowanie!

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

Ostatnia rzecz, nie sądzę, że ViewController.test jest wymagany w parametrze selektora, test powinien działać dobrze. –

+0

dlaczego sprawdza, czy jego zerowa sprawa, zanim ustawisz go na zero –

+0

Zapobiega wywoływaniu invalidate() na potencjalnie zerowym obiekcie. Na przykład, powiedzmy, że nazwiesz stopTimer() w wielu funkcjach. Wystrzeliwuje jeden raz, unieważnia timer i jest cofany do zera. Jeśli funkcja stopTimer() zostanie wywołana ponownie, bez ponownej inicjalizacji licznika, wystąpi błąd krytyczny. Wynika to z faktu, że timer został już zwolniony. Obydwie instrukcje straży są na miejscu, aby kontynuować i zatrzymać synchronizację timera. –