在Swift中调度闭包表达式

时间:2014-06-18 19:47:00

标签: closures swift nstimer

我希望能够安排在将来的绝对或相对时间运行闭包。我看到我可以使用NSTimer来安排稍后调用的选择器,但这不是我想要的。我更愿意看到这样的事情:

let timer = NSTimer.scheduleWithTimeInterval(
    ti: NSTimerInterval(1.0),
    action: {
        // do something
    }
)

在Swift中有没有内置的方法可以做这样的事情?

修改

我现在遇到dispatch_after这似乎更符合我的想法,但我对其他想法持开放态度。

2 个答案:

答案 0 :(得分:4)

dispatch_after应该是一个很好的解决方案,因为没有基于块的NSTimer方法。

或者你可以使用(或创建)一个简单的基于块的NSTimer类别(或Swift中的扩展):https://github.com/jivadevoe/NSTimer-Blocks

答案 1 :(得分:4)

我一直在找同样的事情。我在this Github Gist找到了Nate Cook,这是一个NSTimer扩展程序,允许您传入一个闭包。从该Gist复制以下代码并删除注释。请参阅上面的链接以获取完整版和/或更新版。

extension NSTimer {

    class func schedule(delay delay: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
        let fireDate = delay + CFAbsoluteTimeGetCurrent()
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler)
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
        return timer
    }

    class func schedule(repeatInterval interval: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer {
        let fireDate = interval + CFAbsoluteTimeGetCurrent()
        let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler)
        CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes)
        return timer
    }
}

第一个功能允许您安排延迟事件。第二个允许您安排重复的事件。

<强>用法:

var count = 0
NSTimer.schedule(repeatInterval: 1) { timer in
    count += 1
    print(count)
    if count >= 10 {
        timer.invalidate()
    }
}

NSTimer.schedule(delay: 5) { timer in
    print("5 seconds")
}

(我修改了原来的print(++count)行,因为现在已弃用++。)