swift 3 中的 DISPATCH_TIME_NOW 和向后兼容性

Posted

技术标签:

【中文标题】swift 3 中的 DISPATCH_TIME_NOW 和向后兼容性【英文标题】:DISPATCH_TIME_NOW in swift 3 and Backward compatibility 【发布时间】:2016-07-15 04:37:22 【问题描述】:

根据@matt 对dispatch_after 用法的this 精彩回答,我在操场上尝试了代码,它工作正常(没有错误)。但是当我尝试向后兼容时,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 修复为Replace "DISPATCH_TIME_NOW" with "dispatch_time_t(DISPATCH_TIME_NOW)" 并抛出错误提示

无法将“Int”类型的值转换为预期的参数类型“dispatch_time_t”(又名“UInt64”)

我尝试按照编译器提供的方式修复它,但最终出现更多错误。我应该如何在这里使用向后兼容性?我做错了什么?帮帮忙,谢谢!

【问题讨论】:

let when = dispatch_time(DISPATCH_TIME_NOW, delay) 如果DispatchTime.now() 在iOS 9 上运行,你试过了吗?一些可用性注释是错误的。 为什么要检查iOS10才能使用swift3语法? swift3 确实支持 iOS 低版本,如 7 8 9。如果你想用 swift3 在​​新的 Xcode8 中编译,只需编写 swift 3 语法的代码。你需要的所有代码:func delay(_delay:Double,closure:()->())DispatchQueue.main.after(when:DispatchTime.now()+delay,execute:closure) @MartinR 不,我没有在手机上查看过。我刚刚在操场上尝试过,我得到了这些错误。当我命令单击 'DisptachTime' 和 'now()' 时,它说在 iOS 10 和 macOS 10.12 中可用。所以我想我会尝试 API 可用性,然后出现这些错误。 :( @Dershowitz123:正如我所说:可用性注释有时是错误的。 Swift 3 代码应该在所有支持 Swift 3 的平台上运行。 – dispatch_after 是 Swift 2,不会在 Swift 3 中编译。 【参考方案1】:

DispatchTime.now() 以及几乎所有DispatchQueueDispatchTime 方法都适用于iOS 7、8、9 和10。文档完全不正确。

【讨论】:

以上是关于swift 3 中的 DISPATCH_TIME_NOW 和向后兼容性的主要内容,如果未能解决你的问题,请参考以下文章

Category在项目中的实际运用

iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime

swift 笔记:iOS与JavaScript的交互(三):WKWebView 3. WKUiDelegate - 6 -3重写WKScriptMessageHandler中的用户内容控制器(_:

SKPaymentTransaction(Swift 3)中的交易错误转换问题

Swift 3 中的滑动手势

swift 3.0中的uibutton问题