如何在 Swift 3 中编程延迟
How to program a delay in Swift 3
在 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 个不同的东西,但随后出现以下错误:"Cannot convert DispatchTime.now
to expected value dispatch_time_t
aka UInt64
."
如何在 Swift 3 中的 运行 代码序列之前创建延迟?
经过大量研究,我终于弄明白了这一点。
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 中创建所需的 "wait" 效果。
灵感来自 this answer.
的一部分
试试Swift3.0及以上
实现的以下功能
func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
completion()
}
}
用法
delayWithSeconds(1) {
//Do something
}
我喜欢GCD的单行表示法,更优雅:
DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
// do stuff 42 seconds later
}
另外,在 iOS10 中我们有新的 Timer 方法,例如块初始值设定项:
(因此延迟的操作可能会被取消)
let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
// do stuff 42 seconds later
}
顺便说一句,记住:默认情况下,定时器被添加到默认的运行循环模式。这意味着当用户与您的应用程序的 UI 交互时(例如,当滚动 UIScrollView 时,计时器可能会被冻结)
您可以通过将计时器添加到特定的 运行 循环模式来解决此问题:
RunLoop.current.add(timer, forMode: .common)
在此blog post您可以找到更多详细信息。
//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
}
试试下面的延迟代码
//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
}
一种方法是使用 DispatchQueue.main.asyncAfter
正如很多人已经回答的那样。
另一种方法是使用perform(_:with:afterDelay:)
。 More details here
perform(#selector(delayedFunc), with: nil, afterDelay: 3)
@IBAction func delayedFunc() {
// implement code
}
最常用的是 asyncAfter()
和 Timer
。但是如果阻塞线程没问题,那么还有一个选项:
sleep(3) // in seconds
usleep // in 1/million of second
对于异步编程 (Swift 5.5),在 func 中暂停看起来像这样:
func someAsyncFunc() async {
await Task.sleep(2_000_000_000) // Two seconds
// Code to be executed with a delay here
}
在 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 个不同的东西,但随后出现以下错误:"Cannot convert DispatchTime.now
to expected value dispatch_time_t
aka UInt64
."
如何在 Swift 3 中的 运行 代码序列之前创建延迟?
经过大量研究,我终于弄明白了这一点。
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 中创建所需的 "wait" 效果。
灵感来自 this answer.
的一部分试试Swift3.0及以上
实现的以下功能func delayWithSeconds(_ seconds: Double, completion: @escaping () -> ()) {
DispatchQueue.main.asyncAfter(deadline: .now() + seconds) {
completion()
}
}
用法
delayWithSeconds(1) {
//Do something
}
我喜欢GCD的单行表示法,更优雅:
DispatchQueue.main.asyncAfter(deadline: .now() + 42.0) {
// do stuff 42 seconds later
}
另外,在 iOS10 中我们有新的 Timer 方法,例如块初始值设定项:
(因此延迟的操作可能会被取消)
let timer = Timer.scheduledTimer(withTimeInterval: 42.0, repeats: false) { (timer) in
// do stuff 42 seconds later
}
顺便说一句,记住:默认情况下,定时器被添加到默认的运行循环模式。这意味着当用户与您的应用程序的 UI 交互时(例如,当滚动 UIScrollView 时,计时器可能会被冻结) 您可以通过将计时器添加到特定的 运行 循环模式来解决此问题:
RunLoop.current.add(timer, forMode: .common)
在此blog post您可以找到更多详细信息。
//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
}
试试下面的延迟代码
//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
}
一种方法是使用 DispatchQueue.main.asyncAfter
正如很多人已经回答的那样。
另一种方法是使用perform(_:with:afterDelay:)
。 More details here
perform(#selector(delayedFunc), with: nil, afterDelay: 3)
@IBAction func delayedFunc() {
// implement code
}
最常用的是 asyncAfter()
和 Timer
。但是如果阻塞线程没问题,那么还有一个选项:
sleep(3) // in seconds
usleep // in 1/million of second
对于异步编程 (Swift 5.5),在 func 中暂停看起来像这样:
func someAsyncFunc() async {
await Task.sleep(2_000_000_000) // Two seconds
// Code to be executed with a delay here
}