ios - 将 Swift 函数传递给 NSTimer

标签 ios swift nstimer

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

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

我应该传递给那里的正确“目标”值是多少?有可能吗?

最佳答案

如果您的目标是 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 保留

关于ios - 将 Swift 函数传递给 NSTimer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38803575/

相关文章:

ios - AKClipPlayer 在剪辑中间播放

ios - Swift - 将手势识别器添加到表格单元格中的对象

objective-c - Swift 和 AFNetworking 集成

swift - 计时器在应该 Swift 2 时不停止

ios - 发电机 : Decrement/Subtract a key/value

ios - 在锁屏 ios 上处理推送通知

ios - 如何在单击按钮后 2 秒呈现 AlertController

swift - 在 swift 中使用 NSTimer 倒计时

swift - 可选字段类型不符合 Swift 3 中的协议(protocol)

ios - 查询 Firebase 嵌套数据以检查特定值 - iOS Swift