首页 文章

如何在Swift 3和4中编写dispatch_after GCD?

提问于
浏览
383

在Swift 2中,我能够使用 dispatch_after 延迟使用大中央调度的动作:

var dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
dispatch_after(dispatchTime, dispatch_get_main_queue(), { 
    // your function here 
})

但这似乎不再在Swift 3(或4)中编译 . 在Swift 3中使用新的Dispatch API编写它的首选方法是什么?

11 回答

  • 110

    语法很简单:

    // to run something in 0.1 seconds
    
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
        // your code here
    }
    

    注意,上面添加 seconds 作为 Double 的语法似乎是一个混乱的来源(特别是因为我们习惯于添加nsec) . 那个“将秒添加为 Double ”的语法有效,因为 deadline 是一个 DispatchTime ,并且在幕后,有一个 + 运算符需要 Double 并将这几秒钟添加到 DispatchTime

    public func +(time: DispatchTime, seconds: Double) -> DispatchTime
    

    但是,如果您确实要为 DispatchTime 添加整数msec,μs或nsec,还可以将 DispatchTimeInterval 添加到 DispatchTime . 这意味着你可以这样做:

    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) {
        os_log("500 msec seconds later")
    }
    
    DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(1_000_000)) {
        os_log("1m μs seconds later")
    }
    
    DispatchQueue.main.asyncAfter(deadline: .now() + .nanoseconds(1_500_000_000)) {
        os_log("1.5b nsec seconds later")
    }
    

    由于 DispatchTime 类中 + 运算符的这种单独的重载方法,这些都可以无缝地工作 .

    public func +(time: DispatchTime, interval: DispatchTimeInterval) -> DispatchTime
    
  • 0

    Swift 4:

    DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) {
       // Code
    }
    

    当时 .seconds(Int) ,也可以使用 .microseconds(Int).nanoseconds(Int) .

  • 15

    如果您只想要延迟功能

    Swift 4

    func delay(delay: Double, closure: @escaping () -> ()) {
    
         DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
              closure()
         }
    }
    

    您可以像以下一样使用它:

    delay(delay: 1) { 
        print("Hi!")
    }
    
  • 5

    在Swift 3发布之后,还必须添加@escaping

    func delay(_ delay: Double, closure: @escaping () -> ()) {
      DispatchQueue.main.asyncAfter(deadline: .now() + delay) {
        closure()
      }
    }
    
  • 49

    Swift 4

    你可以在DispatchQueue上创建一个扩展,并添加内部使用 DispatchQueue asyncAfter函数的函数延迟

    extension DispatchQueue {
       static func delay(_ delay: DispatchTimeInterval, closure: @escaping () -> ()) {
          DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: closure)
       }
    }
    

    并使用

    DispatchQueue.delay(.milliseconds(10)) {
       print("task to be done")
    }
    
  • 942

    接受的答案有点不同的味道 .

    Swift 4

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 + .milliseconds(500) + 
    .microseconds(500) + .nanoseconds(1000)) {
                    print("Delayed by 0.1 second + 500 milliseconds + 500 microseconds + 
                          1000 nanoseconds)")
     }
    
  • 0

    拨打 DispatchQueue.main.after(when: DispatchTime, execute: () -> Void)

    我强烈建议使用Xcode工具转换为Swift 3(编辑>转换>转换为当前Swift语法) . 它为我 grab 了这个

  • 4

    这在Swift 3中对我有用

    let time1 = 8.23
    let time2 = 3.42
    
    // Delay 2 seconds
    
    
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
        print("Sum of times: \(time1 + time2)")
    }
    
  • 3

    您可以使用

    DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(100)) {
            // Code
        }
    
  • 0

    试试这个

    let when = DispatchTime.now() + 1.5
        DispatchQueue.main.asyncAfter(deadline: when) {
            //some code
        }
    
  • 0

    在Swift 4.1和Xcode 9.4.1中

    简单的答案是......

    //To call function after 5 seconds time
    DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
    //Here call your function
    }
    

相关问题