我是 swift 异步方面的新手,我正在尝试实现对函数的简单异步调用。
import UIKit
func doAsyncStuff ( completionHandler: (_ result: Double) -> Void) {
print("start async")
sleep(5) // to simulate long work
let result: Double = 123.456
completionHandler(result)
}
print("A")
doAsyncStuff() { result in
print(result)
}
print("B")
当我执行它时,我得到
A
start async
123.456
B
由于函数是异步调用的,所以我希望得到
A
start async
B
123.456
我哪里错了? 非常感谢
最佳答案
问题是您正在调用 sleep
,这是一个同步阻塞函数,因此您阻塞了主线程 5 秒,同时无法执行任何其他操作。您应该使用 DispatchQueue.asyncAfter
来测试简单的异步调用。
您还可以知道您的函数不是异步的,因为您没有收到编译器错误,因为您没有将闭包标记为 @escaping
,您需要为异步完成处理程序执行此操作。
func doAsyncStuff(completionHandler: @escaping (_ result: Double) -> Void) {
print("start async")
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {
completionHandler(123.456)
}
}
关于iOS异步功能不按顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54364384/