延迟 '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 中合并的外观,在这里也可能是一个有用的选项。