在早期版本的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中运行一系列代码之前创建延迟?
答案 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
}