【发布时间】:2015-03-30 02:45:38
【问题描述】:
我在代码中使用/实现 NSTimer 时遇到了一些麻烦。到目前为止,我有这个:
//Delay function from http://stackoverflow.com/questions/24034544/dispatch-after-gcd-in-swift/24318861#24318861
func delay(delay:Double, closure:()->()) {
dispatch_after(
//adds block for execution at a specific time
dispatch_time(
//creates a dispatch time relative to default clock
DISPATCH_TIME_NOW,
//Indicates that something needs to happen imediately
Int64(delay * Double(NSEC_PER_SEC))
//a 64bit decleration that holds the delay time times by the amount of nanoseconds in one seconds, inorder to turn the 'delay' input into seconds format
),
dispatch_get_main_queue(), closure)
}
@IBAction func computerTurn(){
if(isFirstLevel){levelLabel.text = ("Level 1"); isFirstLevel = false}
else{ level++ }
var gameOrderCopy = gameOrder
var randomNumber = Int(arc4random_uniform(4))
gameOrder.append(randomNumber)
var i = 0
var delayTime = Double(1)
println(Double(NSEC_PER_SEC))
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)
}
}
我需要做的是替换定时器功能,或者去掉它,和这里发生的事情一样,但是使用 NSTimer。
谢谢
【问题讨论】:
-
为什么?
dispatch_after()是解决此问题的更好工具。NSTimer会不必要地复杂。 -
@RobNapier,一旦 delayTime 变量超过 13,dispatch_after() 就会出现故障,因为延迟时间太长了,所以我需要使用 NSTimer 所以它可以超过 13 秒。
-
@RobNapier 在 iOS 8(但不是 iOS 7)中,如果你安排一堆
dispatch_after,就像上面的代码一样,(比如说,20 个,每个间隔 1 秒),前几个很好,但你会看到它开始将后面的一些合并成组。您必须使用重复计时器。如果你想使用dispatch_after,你不能像这段代码那样预先安排它们,而是只安排第一个并让完成块触发下一个。 -
@JohnnyCash 同样,请告诉我们您是在 iOS 还是 Mac OS X 上执行此操作。