2014-12-03 8 views
6

Alle Beispiele, die ich bei der Verwendung von "NSTimer.scheduledTimerWithTimeInterval" in Swift gesehen habe, zeigen den Parameter "target: self", aber das funktioniert leider nicht direkt in Swift Playgrounds.NSTimer.scheduledTimerWithTimeInterval in Swift Playground

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

Hier ist ein Beispiel darüber verwiesen führt zu dem Fehler:

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() 

Antwort

8

Sie sollten wirklich nicht NSTimer in diesen Tagen mit werden. Es verbraucht eine Menge Ressourcen, verursacht unnötigen Batterieverbrauch und die API eignet sich für hässlichen Code.

Verwenden dispatch_after() statt:

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

Natürlich, da der Timer Feuer nach Spielplatz macht es Zeug Sie ein Äquivalent von timer.fire() benötigen um den Code auszuführen sofort statt nach einer 0 Sekunden Verzögerung zu erzwingen. Hier ist, wie das funktioniert:

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

dispatch_after(0, dispatch_get_main_queue(), printFrom1To1000) 

printFrom1To1000() 
+0

In meinem Fall muss ich den Webservice alle 5 Minuten treffen. Wäre es die gute Option, diesen Code zu verwenden? –

3

diese direkt in einem Swift Spielplatz laufen zu erhalten, müssen Sie die printFrom1To1000 Funktion innerhalb einer Klasse einzubetten und stellen Sie dann eine Instanz dieser Klasse zum Parameter "target:" anstelle von "self".

Hier ist ein voll funktionierendes Beispiel:

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

Wenn Sie bereits ein Objekt haben Sie verweisen (das heißt, ein Etikett zu aktualisieren), können Sie diese Art erweitern können und die Funktion als Selector verwenden. Ich finde das einfacher als eine ganz neue Klasse zu erstellen und daraus ein neues Objekt zu erstellen.

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() 
Verwandte Themen