NSTimer - как задержать Swift
У меня проблема с задержкой перемещения компьютера в игре.
Я нашел некоторые решения, но они не работают в моем случае, например.
var delay = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: nil, userInfo: nil, repeats: false)
Я попытался использовать это с функцией fire
, но также и без эффектов.
Какие еще существуют возможности?
Ответы
Ответ 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)
}
Ответ 4
Как насчет использования Grand Central Dispatch?
https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html
Вальфер показал вам, как