在代码Swift中实现NSTimer



在代码中使用/实现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执行与这里发生的相同的操作。

感谢

NSTimer在这种情况下可能有点笨拙,因为它需要使用目标操作或NSInvocation。然而,NSTimer是与CFRunLoopTimer免费桥接的,您可以使用块调用它:

func delay(delay:Double, closure:()->()) {
    let fireDate = delay + CFAbsoluteTimeGetCurrent()
    let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0) { _ in
        closure()
    }
    CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
}

我建议:

  • 设置一些类属性以维护";当前";数字索引(从0开始);

  • 启动你的重复计时器;

  • 计时器的处理程序将使用索引来确定要更改哪个按钮;打开高亮显示";然后对"0"执行CCD_ 5;关闭高亮显示";;

    然后,这个处理程序会查看索引,并确定您是否在列表的末尾。如果你是,那么取消计时器,你就完成了。如果你不在列表的末尾;当前索引";并等待下一个预定定时器启动。

最新更新