如何编写Swift 3中的延迟

时间:2016-06-25 17:30:44

标签: ios swift xcode swift3 dispatch-after

在早期版本的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。& #34;

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

6 个答案:

答案 0 :(得分:808)

经过大量的研究,我终于想出了这个。

DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Change `2.0` to the desired number of seconds.
   // Code you want to be delayed
}

这会创造出所需的等待"效果在Swift 3和Swift 4中。

this answer的一部分启发。

答案 1 :(得分:128)

我喜欢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,您可以找到更多详细信息。

答案 2 :(得分:51)

尝试在 Swift 3.0及以上版本

中实施以下功能
func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {
    DispatchQueue.main.asyncAfter(deadline: .now() + seconds) { 
        completion()
    }
}

用法

delayWithSeconds(1) {
   //Do something
}

答案 3 :(得分:29)

请尝试以下代码延迟

//MARK: First Way

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

delayForWork()
// MARK: Second Way

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    // your code here delayed by 0.5 seconds
}

答案 4 :(得分:1)

//在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
}

答案 5 :(得分:0)

一种方法是使用很多人都回答过的DispatchQueue.main.asyncAfter

另一种方法是使用perform(_:with:afterDelay:)More details here

perform(#selector(delayedFunc), with: nil, afterDelay: 3)

@IBAction func delayedFunc() {
    // implement code
}