在Swift中,异步(Asynchronous)指的是任务的执行与调用它的代码的执行不在同一时间完成。
可以理解为,当执行一个操作时,不必等待它结束就可以继续执行后续代码。
核心概念
1、同步(Synchronous):表示调用一个函数时,函数内部的所有操作都必须完成,调用才会返回。
例如:
func add(a: Int, b: Int) -> Int {
return a + b
}
let result = add(a: 2, b: 3) // 调用时直接执行
print(result) // 这里会等 add 完成
2、异步(Asynchronous):调用一个函数时,函数可能立即返回,而操作在稍后完成。通常通过回调、闭包或 async/await 处理结果。
func fetchData(completion: @escaping (String) -> Void) {
DispatchQueue.global().async {
let data = "Hello"
completion(data) // 几秒后才调用
}
}
print("开始请求")
fetchData { result in
print("收到数据: \(result)")
}
print("继续执行其他代码")
输出的顺序可能是:
开始请求
继续执行其他代码
收到数据: Hello
因为DispatchQueue.global().async是一个异步操作,当调用fetchData方法时,函数会立即返回,不会阻碍顺序调用。
常见的异步场景
1、网络请求
URLSession.shared.dataTask(with: url) { data, response, error in
// 服务器响应后才执行
}.resume()
调用立即返回,数据在响应后返回。
2、文件读写/数据库操作
DispatchQueue.global().async {
let content = try? String(contentsOfFile: path)
}
避免阻塞主线程。
3、定时器/延迟操作
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
print("2秒后执行")
}
4、UI事件回调
Button("点击") {
print("按钮点击")
}
事件发生时,闭包被调度执行。
5、Swift Concurrency (Task / async-await)
Task {
let result = await fetchData()
print(result)
}
Task内闭包在函数返回之后执行。
6、GCD队列调度
DispatchQueue.global().async(后台线程)。
DispatchQueue.main.async(主线程下一 runloop)。
总结
只要闭包或操作在函数返回后执行,都属于异步。
