2015-01-16 14 views
28

Mam problem z opóźnieniem ruchu komputera w grze.NSTimer - jak opóźnić Swift

Znalazłem rozwiązania, ale nie działają one w moim przypadku, np.

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

starałem się to wykorzystać z funkcją fire ale również bez efektów.

Jakie są inne możliwości?

+2

Oczywiście nie rozumiesz, co robi NSTimer. Musisz mieć selektor i mieć jakiś kod w tej metodzie, który chcesz uruchomić po uruchomieniu timera. Timer bez selektora nic nie robi. – rdelmar

+0

Ta odpowiedź jest tym, czego szukasz http://stackoverflow.com/a/24318861/3810673 – Ian

+0

dziękuję bardzo! Nie zrozumiałem selektora, ponieważ nie rozumiem, dlaczego powinien on być w apostrofu. Umieściłem tam mój func i wszystko działa świetnie. – Dandy

Odpowiedz

92

Swift 3

Z GCD:

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

    // here code perfomed with delay 

} 

lub z zegarem:

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

z 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 

}) 

lub z zegarem:

func myPerformeCode(timer : NSTimer) { 

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

to świetne rozwiązanie bez dodatkowych metod. Nie myślałem o używaniu parametrów do mojej głównej metody, dziękuję! – Dandy

+0

Chciałbym przegłosować, ale odkryłem, że już to robiłem w przeszłości :) –

2

Swift można opóźnić za pomocą Dispatch_after.

Swift 3.0: -

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

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