2015-01-16 18 views
28

Ho un problema con il ritardo nello spostamento del computer in un gioco.NSTimer - come ritardare in Swift

Ho trovato alcune soluzioni ma non funzionano nel mio caso, ad es.

var delay = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: nil, userInfo: nil, repeats: false) 

ho cercato di utilizzare questa funzione con fire ma anche di effetti.

Quali altre possibilità ci sono?

+2

Chiaramente non capisci cosa fa un NSTimer. Devi avere un selettore e avere del codice nel metodo che vuoi eseguire quando scatta il timer. Un timer senza selettore non fa nulla. – rdelmar

+0

Questa risposta è ciò che stai cercando http://stackoverflow.com/a/24318861/3810673 – Ian

+0

grazie mille! Non ho capito il selettore perché non capisco perché dovrebbe essere in apostrofo. Ho messo lì il mio func e ethingthing funziona alla grande. – Dandy

risposta

92

Swift 3

Con GCD:

let delayInSeconds = 4.0 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delayInSeconds) { 

    // here code perfomed with delay 

} 

o con un timer:

func myPerformeCode() { 

    // here code to perform 
} 
let myTimer : Timer = Timer.scheduledTimer(timeInterval: 4, target: self, selector: #selector(self.myPerformeCode), userInfo: nil, repeats: false) 

Swift 2

Con GCD:

let seconds = 4.0 
let delay = seconds * Double(NSEC_PER_SEC) // nanoseconds per seconds 
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 

dispatch_after(dispatchTime, dispatch_get_main_queue(), { 

    // here code perfomed with delay 

}) 

o con un timer:

func myPerformeCode(timer : NSTimer) { 

    // here code to perform 
} 
let myTimer : NSTimer = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("myPerformeCode:"), userInfo: nil, repeats: false) 
+0

è un'ottima soluzione senza alcun metodo aggiuntivo. Non ho pensato di usare i parametri per il mio metodo principale, grazie! – Dandy

+0

Volevo upvotare, solo per scoprire che ho già fatto in passato :) –

2

a Swift possiamo ritardare utilizzando Dispatch_after.

SWIFT 3.0: -

DispatchQueue.main.asyncAfter(deadline: .now()+4.0) { 

     alert.dismiss(animated: true, completion: nil) 
    }