Swift中使用await时是否需为所有函数加async?附调用链实例问询
Swift异步函数调用问题解答
核心问题解答
1. 将call5()改为async后,是否必须修改所有上层调用函数?
不需要全部修改,具体取决于你调用异步函数的方式:
- 若选择用
await等待call5()的执行结果,那么直接调用它的call4()必须标记为async;同理,若call3()要通过await调用call4(),也得改成async,以此类推——因为await只能在标记了async的异步函数内部使用。 - 若不想修改上层函数,可通过
Task启动异步任务,无需上层函数变为async:
这种方式下,func call4() { Task { await call5() } }call4()到call1()都保持原同步状态即可,异步任务会在后台独立执行,不阻塞当前线程。
2. 使用await时,是否必须在所有函数中都使用async?
当然不是。await仅能在异步函数内部使用,只有当函数需要调用异步函数并等待其结果时,才需要标记为async。如果某个函数不需要等待异步操作完成,或者通过Task等方式启动异步任务但不等待,完全不需要改成async。
举个实际场景的例子:
func viewDidLoad() { super.viewDidLoad() // 在同步方法里启动异步任务,无需修改当前方法为async Task { let data = await fetchRemoteData() updateUI(with: data) } } // 异步函数,用于获取远程数据 func fetchRemoteData() async -> Data { // 异步网络请求逻辑 }
内容的提问来源于stack exchange,提问作者fabiobh
相关产品推荐
相关产品推荐

