Swift3.0中GCD延时函数asyncAfter的使用

尝试了下Swift3.0中GCD的延时函数,发现貌似与之前的有挺大的不同,折腾了好一会终于算是会用了一丢丢

  • swift3.0中有4个延迟函数,如下
public func asyncAfter(deadline: DispatchTime, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping @convention(block) () -> Swift.Void)

public func asyncAfter(wallDeadline: DispatchWallTime, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping @convention(block) () -> Swift.Void)

public func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)

public func asyncAfter(wallDeadline: DispatchWallTime, execute: DispatchWorkItem)

一般开发中,用第三个应该就足够了,下面看看具体使用

public func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem)
// 该方法接收一个DispatchTime的参数,点进这个类型的里面可以发现实个结构体
public struct DispatchTime : Comparable {
    public let rawValue: dispatch_time_t
    public static func now() -> DispatchTime
    public static let distantFuture: DispatchTime
    public init(uptimeNanoseconds: UInt64)
    public var uptimeNanoseconds: UInt64 { get }
}
// 看了之后一片迷茫,不知道怎么使用,最后做了个大胆的尝试
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2, execute: {
            self.tableView?.reloadData()
            if self.refreshControl?.isRefreshing == true {
                self.refreshControl?.endRefreshing()
            }
        })

DispatchTime.now() 获取当前时间,
DispatchTime.now() + 2, 在当前时间的基础上加2,那就是延时两秒了,是不是感觉还是有些麻烦,那么继续往下看~

偶然看见大神写的关于DispatchTime的扩展,然后就可以按照更简单的方式使用GCD的延时函数.详情如下

extension DispatchTime: ExpressibleByIntegerLiteral {
    public init(integerLiteral value: Int) {
        self = DispatchTime.now() + .seconds(value)
    }
}
extension DispatchTime: ExpressibleByFloatLiteral {
    public init(floatLiteral value: Double) {
        self = DispatchTime.now() + .milliseconds(Int(value * 1000))
    }
}

有了上面两个分类之后你就可以像下面这么用

 DispatchQueue.main.asyncAfter(deadline: 2, execute: {
           /*
          在此做你想做的事~,是不是超赞
          */
        })

以上仅供参考,如有不对的地方,还望各位指教
原文链接

你可能感兴趣的:(Swift3.0中GCD延时函数asyncAfter的使用)