在 Swift 3 中 DISPATCH_TIME_NOW 的向后兼容性问题

8

根据@matt对dispatch_after用法的这个精彩回答,我在playground上尝试了一下代码,它可以正常工作(没有错误)。但是当我尝试进行向后兼容,因为DispatchTime.now()仅适用于iOS 10,如下所示:

func delay( _ delay: Double, closure: () -> ()){
    guard #available(iOS 10, *) else {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
        return
    }
    let when = DispatchTime.now() + delay
    DispatchQueue.main.after(when: when, execute: closure)
}

编译器建议将 DISPATCH_TIME_NOW 更改为 dispatch_time_t(DISPATCH_TIME_NOW), 并报错如下:

无法将类型为 'Int' 的值转换为预期的参数类型 'dispatch_time_t' (也称为 'UInt64')

我尝试按照编译器建议进行修复,但最终出现了更多错误。在这种情况下,我应该如何使用向后兼容性?我做错了什么?请帮忙解决,谢谢!

let when = dispatch_time(DISPATCH_TIME_NOW, delay) - iphonic
1
你尝试过在iOS 9上运行 DispatchTime.now() 吗?一些可用性注释是错误的。 - Martin R
1
为什么需要检查iOS10以使用Swift3语法?Swift3真的支持像7、8、9这样的较低版本的iOS。如果您想在新的Xcode8中编译Swift3,只需使用Swift 3语法编写代码即可。您需要的所有代码是: func delay(_ delay: Double, closure: () -> ()) { DispatchQueue.main.after(when: DispatchTime.now() + delay, execute: closure) } - larva
@MartinR 我没有在手机上检查过。我只是在playground中尝试了一下,然后就出现了那些错误。当我命令点击'DisptachTime'和'now()'时,它说可用于iOS 10和macOS 10.12。所以我想尝试API可用性,然后这些错误就出现了。 :( - Mtoklitz113
@AshishKakkad,Swift 3确实支持iOS 7。我已经在你的回答中添加了一条评论。 - Cœur
显示剩余4条评论
1个回答

3

DispatchTime.now(),以及几乎所有的DispatchQueueDispatchTime方法,都适用于iOS 7、8、9和10。文档只是错误的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接