Подтвердить что ты не робот

NSTimer - как задержать Swift

У меня проблема с задержкой перемещения компьютера в игре.

Я нашел некоторые решения, но они не работают в моем случае, например.

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

Я попытался использовать это с функцией fire, но также и без эффектов.

Какие еще существуют возможности?

4b9b3361

Ответ 1

Swift 3

С GCD:

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

    // here code perfomed with delay

}

или с таймером:

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

С 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

})

или с таймером:

func myPerformeCode(timer : NSTimer) {

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

Ответ 2

С Swift 4.2

С Timer Вы можете избежать использования селектора, используя вместо этого замыкание:

    Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (nil) in
        // Your code here
    }

Имейте в виду, что Timer является бесплатным по CFRunLoopTimer с CFRunLoopTimer, а циклы выполнения и GCD - это два совершенно разных подхода.... e

Ответ 3

В быстром режиме мы можем задержать с помощью Dispatch_after.

SWIFT 3.0: -

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

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