延迟 'glitch' dispatch_after swift
Delay 'glitch' with dispatch_after swift
目前我有一个延时功能如下:
//Delay function from
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,延迟开始增加。
谢谢!
你没有说什么 platform/OS,但如果在 iOS 上,此行为从 iOS 7 更改为 iOS 8。它似乎是合并计时器(一种节能功能,可将类似的计时器事件组合在一起以最大限度地减少功耗)。
解决方案是重构代码以使用单个重复计时器,或者不是预先安排所有 dispatch_after
调用,而是让每个 dispatch_after
触发下一个 dispatch_after
在它的完成块中(因此永远不会有一堆 dispatch_after
调用同时挂起,它可能会合并在一起)。
顺便说一下,如果使用重复计时器,您可能希望使用调度源计时器而不是 NSTimer
,因为这不仅使您能够指定所需的回旋余地,而且第三个dispatch_source_set_timer
的参数允许您指定 DISPATCH_TIMER_STRICT
的值,其中:
Specifies that the system should make a best effort to strictly observe the
leeway value specified for the timer via dispatch_source_set_timer(), even
if that value is smaller than the default leeway value that would be applied
to the timer otherwise. A minimal amount of leeway will be applied to the
timer even if this flag is specified.
CAUTION: Use of this flag may override power-saving techniques employed by
the system and cause higher power consumption, so it must be used with care
and only when absolutely necessary.
在 Mac OS X 中,这可以用来关闭 "App Nap" 功能(为了最大限度地延长电池寿命,定时器将被更显着地改变),但是考虑到此计时器在 iOS 中合并的外观,在这里也可能是一个有用的选项。
目前我有一个延时功能如下:
//Delay function from
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,延迟开始增加。
谢谢!
你没有说什么 platform/OS,但如果在 iOS 上,此行为从 iOS 7 更改为 iOS 8。它似乎是合并计时器(一种节能功能,可将类似的计时器事件组合在一起以最大限度地减少功耗)。
解决方案是重构代码以使用单个重复计时器,或者不是预先安排所有 dispatch_after
调用,而是让每个 dispatch_after
触发下一个 dispatch_after
在它的完成块中(因此永远不会有一堆 dispatch_after
调用同时挂起,它可能会合并在一起)。
顺便说一下,如果使用重复计时器,您可能希望使用调度源计时器而不是 NSTimer
,因为这不仅使您能够指定所需的回旋余地,而且第三个dispatch_source_set_timer
的参数允许您指定 DISPATCH_TIMER_STRICT
的值,其中:
Specifies that the system should make a best effort to strictly observe the leeway value specified for the timer via dispatch_source_set_timer(), even if that value is smaller than the default leeway value that would be applied to the timer otherwise. A minimal amount of leeway will be applied to the timer even if this flag is specified.
CAUTION: Use of this flag may override power-saving techniques employed by the system and cause higher power consumption, so it must be used with care and only when absolutely necessary.
在 Mac OS X 中,这可以用来关闭 "App Nap" 功能(为了最大限度地延长电池寿命,定时器将被更显着地改变),但是考虑到此计时器在 iOS 中合并的外观,在这里也可能是一个有用的选项。