如何在swift中添加时间延迟

时间:2015-03-21 23:32:26

标签: swift time iteration

我正在用swift编写一个交互式游戏,我需要知道如何在重复动作之间添加一个暂停。我必须这样做的方式是for循环。如下:

for i in 1...10 {
    println("Hello!")
}

有没有人能找到修改此代码的方法,以便每秒打印一个“Hello”?

此外,如果swift for循环立即返回,我不认为延迟代码会在那里工作,所以这里是另一个使用函数的迭代解决方案,如果for循环没有。< / p>

func printer() {
    println("Hello")
    delay()
}

func delay() {
    //delay code goes here
    printer()
}

非常感谢任何帮助。

感谢。

3 个答案:

答案 0 :(得分:1)

试试这个

for i in 1...10{
    var timeToDelay = Double(i)
    delay(timeToDelay) {
        println("Hello")
    }
}

func delay(delay:Double, closure:()->()) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW,Int64(delay * Double(NSEC_PER_SEC))),dispatch_get_main_queue(), closure)
}

答案 1 :(得分:0)

欢迎来到SO。

viewDidLoad例如:

var aDelay = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:Selector("printer"), userInfo: nil, repeats: true)

让你的方法在同一个视图控制器中:

func printer() {
    println("Hello")
}

这应该按要求工作。 然而,这可能不是最好的,取决于你正在制作的游戏等等......

答案 2 :(得分:0)

正确的解决方案取决于您需要定期执行的操作。如果你正在更新用户界面(例如,添加一个滴答计时器),那么你需要的东西不同于你在后台做某事(比如保存游戏状态)。

如果您每秒更新一次用户界面,那么最好使用CADisplayLink定期更新界面。我们假设您有一个标签timeLabel,您需要更新。以下是如何做到的:

class ViewController: UIViewController {
    @IBOutlet weak var timeLabel: UILabel!
    var startTime: CFTimeInterval?
    var link: CADisplayLink?

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        self.link = CADisplayLink(self, selector: Selector("updateTime:"))
        self.link.addToRunLoop(NSRunLoop.currentRunLoop(), NSDefaultRunLoopMode)
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)

        self.link?.invalidate()
        self.link = nil
    }

    func updateTime(link: CADisplayLink) {
        if startTime == nil {
            startTime = link.timestamp
        }
        let elapsed = Int(link.timestamp - startTime!)
        self.timeLabel?.text = "\(elapsed)"
    }
}

如果您只是在做后台工作(比如保存游戏状态......或打印你好),那么使用NSTimer或大型中央调度将会很好。如果您要更新用户界面,则不想使用NSTimer或大型中央调度,因为这些机制并不精确。

Grand Central Dispatch

fun work() {
    // do work here
}

func workEverySecond() {
    let d = dispatch_time(DISPATCH_TIME_NOW, Int64(NSEC_PER_SEC))
    let repeatWork: () -> Void = {
        work()
        dispatch_after(timeDelay, dispatch_get_main_queue(), repeatWork)
    }
    repeatWork()
}

<强>的NSTimer

var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector:Selector("work"), userInfo: nil, repeats: true)

func work() {
    // do work here
}