我正在用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()
}
非常感谢任何帮助。
感谢。
答案 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
}