目前,我有一个延迟功能如下:
//Delay function from http://stackoverflow.com/questions/24034544/dispatch-after-gcd-in-swift/24318861#24318861
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
此代码适用于我需要的内容,但是一旦延迟大于13秒,它就会出现故障并停止延迟。有没有人知道这个解决方案,甚至在发生这种情况时?
以下是我使用的代码:
var delayTime = Double(1)
for number in self.gameOrder{
if number == 0{
delay(delayTime++){self.greenButton.highlighted = true}
self.delay(delayTime++){
self.greenButton.highlighted = false
}
}
else if number == 1{
delay(delayTime++){self.redButton.highlighted = true}
self.delay(delayTime++){
self.redButton.highlighted = false
}
}
else if number == 2{
delay(delayTime++){self.yellowButton.highlighted = true}
self.delay(delayTime++){
self.yellowButton.highlighted = false
}
}
else if number == 3{
delay(delayTime++){self.blueButton.highlighted = true}
self.delay(delayTime++){
self.blueButton.highlighted = false
}
}
println(delayTime)
}
}
}
一旦delayTime达到13,延迟开始播放。
谢谢!
答案 0 :(得分:1)
你没有说出什么平台/操作系统,但是如果在iOS上,这种行为从iOS 7变为iOS 8.它似乎是合并定时器(一种省电功能,将类似的定时器事件组合在一起以最小化功耗)。
解决方案是重构代码以使用单个重复计时器,或者不是预先安排所有dispatch_after
个调用,让每个dispatch_after
触发其中的下一个dispatch_after
完成块(因此永远不会有一堆dispatch_after
个调用在它可能被合并在一起的同时处于暂挂状态。)
顺便说一句,如果使用重复计时器,您可能希望使用调度源计时器而不是NSTimer
,因为这不仅可以指定所需的余地,还可以使用第三个参数。 dispatch_source_set_timer
允许您指定DISPATCH_TIMER_STRICT
的值:
指定系统应尽最大努力严格遵守 通过dispatch_source_set_timer()为计时器指定的余地值,甚至 如果该值小于将应用的默认余地值 否则,到计时器。最小的余地将适用于 即使指定了这个标志,也是计时器。
注意:使用此标志可能会超越使用的节电技术 系统并导致更高的功耗,因此必须小心使用 并且只在绝对必要的时候。
在Mac OS X中,这可用于关闭“App Nap”功能(定时器将更加显着地改变,以便最大限度地延长电池寿命),但鉴于此计时器的外观在iOS中合并,它可能是这里也是一个有用的选择。