将Swift函数传递给NSTimer

时间:2016-08-06 11:07:47

标签: ios swift nstimer

我在另一个函数中有一些函数。在function1中我想使用NSTimer在一段时间之后调用func2:

func myFunc1()
{
   NSTimer.scheduledTimerWithTimeInterval(1, target: ??, selector:#selector(myFunc2()), userInfo: nil, repeats: false)
   func myFunc2()
   {
      // do something...
   }
}

什么是正确的"目标"我应该通过那里的价值?它甚至可能吗?

2 个答案:

答案 0 :(得分:9)

如果您的目标是iOS 10之前的版本,则无法将函数传递给NSTimer,因为当时没有引入API来支持闭包回调。

iOS 10及更高版本

// swift 2.x users should still use NSTimer instead
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: true) { timer in
    // ...
}

通用方法

您可以添加此类,并随时重复使用它:

final class TimerInvocation: NSObject {

    var callback: () -> ()

    init(callback: @escaping () -> ()) {
        self.callback = callback
    }

    func invoke() {
        callback()
    }
}

extension Timer {

    static func scheduleTimer(timeInterval: TimeInterval, repeats: Bool, invocation: TimerInvocation) {

        Timer.scheduledTimer(
            timeInterval: timeInterval,
            target: invocation,
            selector: #selector(TimerInvocation.invoke(timer:)),
            userInfo: nil,
            repeats: repeats)
    }
}

通过这门课程,您现在可以直接执行此操作:

let invocation = TimerInvocation {
    /* invocation code here */
}

NSTimer.scheduledTimerWithTimeInterval(1, target: invocation, selector:#selector(TimerInvocation.invoke), userInfo: nil, repeats: false)

您不必担心保留invocation变量,因为NSTimer

保留了该变量

答案 1 :(得分:3)

在Swift 3中,新的Timer有一个带闭包的工厂方法:

Timer.scheduledTimer(withTimeInterval: TimeInterval, repeats: Bool, block: (Timer) -> Void)

在你的情况下,你可以使用尾随闭包语法这样调用它:

Timer.scheduledTimer(withTimeInterval: 1, repeats: false) { _ in
    // do something
}

注意:仅适用于iOS 10或更高版本。