2016-12-23 39 views
5

ateş ve şuna da kasaba sadeleştirdik değil:Swift 3 Zamanlayıcı ben Swift içinde Timer kullanmaya çalışıyorum

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

başka işlevinden bu çağırmak istiyorum ve doğruladıktan startTimer işlev çalışır, ancak zamanlayıcı ateş etmez. Bunun RunLoop ile ilgisi var mı? Kodlama konusunda oldukça yeniyim, bu yüzden herhangi bir açıklama takdir edilecektir.

+0

'ViewController' ==' self'? – vadian

+0

Kod snippet'inden kovulduğunu varsayardım, bu yüzden 'startTimer()' adlı şeyin çağrıldığından emin olun, değil mi? ve -belki de- sınıfınız "ViewController" olarak adlandırılır. –

+0

StartTimer içinde bir çağrının eklendiğinden emin olun. –

cevap

12

İyi Uygulama: startTimer() 'de zamanlayıcının önceden oluşturulmadığını kontrol edin ve ödevi yapın. StopTimer() 'de, geçersiz kılmayı çağırmadan önce zamanlayıcının mevcut olduğunu kontrol edin ve zamanlayıcıyı tekrar nil olarak ayarlayın.

Ayrıca, seçiciniz için @obj öneki olduğundan emin olun. Sağlanan kod ile bir çalışma zamanlayıcısı alabilmeniz gerekir. Mutlu kodlar!

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

Son bir şey, seçici parametrenizde ViewController.test gerektiğini sanmıyorum, test gayet iyi çalışmalı. –

+0

nil meselesi nil –

+0

nu belirlemeden önce kontrol etmeyi niçin kontrol ederse, invalidate() öğesini potansiyel olarak sıfır olan bir nesnede çağırmayı engeller. Örneğin, birçok işlevde stopTimer() öğesini çağırdığınızı varsayalım. Bir kez patlar, zamanlayıcıyı geçersiz kılar ve tekrar sıfırlanır. Eğer zamanlayıcıyı yeniden başlatmadan stopTimer() tekrar tekrar çağrılırsa, önemli bir hata alırsınız. Bunun nedeni, zamanlayıcının önceden ayrılmış olmasıdır. Her iki koruma deyimi, zamanlayıcıyı senkronize olarak başlatmaya ve durdurmaya devam edecek şekilde yerleştirilmiştir. –