setTimer 在 Swift 3 中被弃用了吗?

Posted

技术标签:

【中文标题】setTimer 在 Swift 3 中被弃用了吗?【英文标题】:Was setTimer deprecated in Swift 3? 【发布时间】:2016-07-01 14:34:41 【问题描述】:

我正在尝试为 Swift 3 创建一个 CocoaPod。因为 CocoaPods 使用 Nimble 和 Quick,而这些库尚未更新,所以我分叉了 repos 并尝试转换它们。

在 Nimble 项目中有一个函数调用,签名为:

setTimer(start: DispatchTime, interval: UInt64, leeway: UInt64)

编译器说Cannot invoke 'setTimer' with an argument list of type '(start: DispatchTime, interval: UInt64, leeway: UInt64)'

private let pollLeeway: UInt64 = NSEC_PER_MSEC
let interval = UInt64(pollInterval * Double(NSEC_PER_SEC))
asyncSource.setTimer(start: DispatchTime.now(), interval: interval, leeway: pollLeeway)

自动完成显示所有 setTimer 方法都已弃用,但从我found 来看,它们不应该是。

有替代品吗?

【问题讨论】:

【参考方案1】:

在 Swift 3.0 中你应该使用

let timer = DispatchSource.makeTimerSource(flags: DispatchSource.TimerFlags(rawValue: UInt(0)), queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.default))
    timer.scheduleRepeating(deadline: DispatchTime.init(uptimeNanoseconds: UInt64(100000)), interval: DispatchTimeInterval.seconds(1), leeway: DispatchTimeInterval.seconds(0))

改为,它对我有用

【讨论】:

【参考方案2】:

在 Xcode 8 beta 1 中,该方法的签名是:

public func setTimer(start: DispatchTime, 
                  interval: DispatchTimeInterval, 
                    leeway: DispatchTimeInterval = default)

如果您插入正确的 DispatchTimeDispatchTimeInterval 参数,它将编译并且您将看到弃用警告:

'setTimer(start:leeway:)' is deprecated: replaced by 
instance method 'DispatchSourceTimer.scheduleOneshot(deadline:leeway:)'

与往常一样,通过命令+单击这些 Swift 类和方法将带您进入声明这些方法的 Swift 接口源代码。

【讨论】:

以上是关于setTimer 在 Swift 3 中被弃用了吗?的主要内容,如果未能解决你的问题,请参考以下文章

AUGraph 在 iOS 上被弃用了吗?如果是这样,啥时候?

`shouldOverrideUrlLoading` 真的被弃用了吗?我可以用啥代替?

RXJS 中的 startWith 运算符真的被弃用了吗?

Hash Rocket被弃用了吗?

使用 rails 演示者 - 可记忆化在 3.1 中被弃用 - 使用 ||= 代替?

Swift 3 模式已被弃用