2014-12-03 24 views
6

Wszystkie przykłady, które widziałem przy użyciu "NSTimer.scheduledTimerWithTimeInterval" w Swift pokazują przy użyciu parametru "target: self", ale niestety to nie działa bezpośrednio na Swift Playgrounds.NSTimer.scheduledTimerWithTimeInterval na Swift Playground

Playground execution failed: <EXPR>:42:13: error: use of unresolved 
identifier 'self' 
    target: self, 

Oto przykład mowa powyżej, które prowadzi do błędu:

func printFrom1To1000() { 
    for counter in 0...1000 { 
     var a = counter   
    } 
} 

var timer = NSTimer.scheduledTimerWithTimeInterval(0, 
    target: self, 
    selector: Selector("printFrom1To1000"), 
    userInfo: nil, 
    repeats: false 
    ) 
timer.fire() 

Odpowiedz

8

Naprawdę nie należy używać NSTimer te dni. Zużywa wiele zasobów, powoduje niepotrzebne wyczerpywanie baterii, a API nadaje się do brzydkiego kodu.

Zastosowanie dispatch_after() zamiast:

dispatch_after(0, dispatch_get_main_queue()) {() -> Void in 
    for counter in 0...1000 { 
    var b = counter 
    } 
} 

Oczywiście, ponieważ licznik będzie ogień po zabaw robi to rzeczy trzeba będzie równowartość timer.fire() zmusić kod do wykonania natychmiast, a nie po 0 sekundowym opóźnieniem. Oto jak to działa:

let printFrom1To1000 = {() -> Void in 
    for counter in 0...1000 { 
    var b = counter 
    } 
} 

dispatch_after(0, dispatch_get_main_queue(), printFrom1To1000) 

printFrom1To1000() 
+0

W moim przypadku muszę naciskać serwis internetowy po każdych 5 minutach. Czy byłoby dobrym rozwiązaniem użycie tego kodu? –

3

Aby to uzyskać, aby działać bezpośrednio w Swift Playground, musisz umieścić funkcję printFrom1To1000 w klasie, a następnie ustaw instancja tej klasy do parametru "target:" zamiast "self".

Oto pełny przykład roboczych:

class myClass: NSTimer{ 
    func printFrom1To1000() { 
     for counter in 0...1000 { 
      var b = counter 
     } 
    } 
} 

let myClassInstance = myClass() 

var timer = NSTimer.scheduledTimerWithTimeInterval(0, 
    target: myClassInstance, 
    selector: Selector("printFrom1To1000"), 
    userInfo: nil, 
    repeats: false 
) 
timer.fire() 
0

Jeśli masz już obiekt, który odwołują (tj aktualizowanie etykietę), można przedłużyć ten typ i używać tej funkcji jako selektor. Uważam, że jest to łatwiejsze niż tworzenie zupełnie nowej klasy i tworzenie z niej nowego obiektu.

extension SKLabelNode { 
    func updateMe() { 
    count++ 
    label.text = "\(count)" 
    } 
} 

var timer = NSTimer.scheduledTimerWithTimeInterval(0.25, 
    target: label, 
    selector: Selector("updateMe"), 
    userInfo: nil, 
    repeats: true) 
timer.fire() 
Powiązane problemy