延迟'故障'用dispatch_after swift

时间:2015-03-29 02:38:37

标签: swift delay

目前,我有一个延迟功能如下:

//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,延迟开始播放。

谢谢!

1 个答案:

答案 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中合并,它可能是这里也是一个有用的选择。