首页 文章

如何编写Swift 3中的延迟

提问于
浏览
226

在早期版本的Swift中,可以使用以下代码创建延迟:

let time = dispatch_time(dispatch_time_t(DISPATCH_TIME_NOW), 4 * Int64(NSEC_PER_SEC))
dispatch_after(time, dispatch_get_main_queue()) {
    //put your code which should be executed with a delay here
}

但是现在,在Swift 3中,Xcode自动更改了6个不同的内容,但随后出现以下错误:“无法将 DispatchTime.now 转换为预期值 dispatch_time_t 又名 UInt64 . ”

如何在Swift 3中运行一系列代码之前创建延迟?

6 回答

  • 691

    经过大量的研究,我终于想到了这个 .

    DispatchQueue.main.asyncAfter(deadline: .now() + 2) { // change 2 to desired number of seconds
       // Your code with delay
    }
    

    这在Swift 3和Swift 4中创建了所需的“等待”效果 .

    灵感来自this answer的一部分 .

  • -3

    我喜欢GCD的单行表示法,它更优雅:

    DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
            // do stuff 42 seconds later
        }
    

    此外,在iOS 10中我们有新的Timer方法,例如块初始化器:

    (因此可能会取消延迟行动)

    let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
            // do stuff 42 seconds later
        }
    

    顺便说一句,请记住:默认情况下,计时器被添加到默认的运行循环模式 . 这意味着当此循环模式处于保持状态时(例如,滚动UIScrollView时)可能会冻结计时器 . 您可以通过将计时器添加到特定的运行循环模式来解决此问题:

    RunLoop.current.add(timer, forMode: .commonModes)
    

    在这个blog post你可以找到更多细节 .

  • 47

    尝试 Swift 3.0 and above 中实现的以下功能

    func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {
        DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { 
            completion()
        }
    }
    

    用法

    delayWithSeconds(1) {
       //Do something
    }
    
  • 118

    请尝试以下代码进行延迟

    // MARK:First Way

    func delayForWork() {
        delay(3.0) {
            print("delay for 3.0 second")
        }
    }
    
    delayForWork()
    

    // MARK:第二种方式

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        // your code here
    }
    
  • 0

    //在x秒后运行功能

    public static func runThisAfterDelay(seconds: Double, after: @escaping () -> Void) {
        runThisAfterDelay(seconds: seconds, queue: DispatchQueue.main, after: after)
    }
    
    public static func runThisAfterDelay(seconds: Double, queue: DispatchQueue, after: @escaping () -> Void) {
        let time = DispatchTime.now() + Double(Int64(seconds * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)
        queue.asyncAfter(deadline: time, execute: after)
    }
    

    //使用:-

    runThisAfterDelay(seconds: x){
      //write your code here
    }
    
  • 24

    我在Swift 4中这样做:

    Thread.sleep(until: Date(timeIntervalSinceNow: 2.5))
    

    这一行代码阻塞当前线程,直到指定的时间结束 . 延迟时间以日期格式定义 . 上面使用的Date初始化程序版本只采用Double格式的第二个值 . 该值可能具有毫秒级的分辨率 .

    请注意,如果在主线程上调用此代码,UI将冻结指定的时间 .

相关问题