Swift async/await如何忽略「Consider using asynchronous alternative function」警告
问题原因
这个警告是Xcode 13 + Swift 5.5 新增的编译器检测逻辑:当带有completion回调的Objective-C方法被自动桥接生成了对应的Swift async/await版本接口时,编译器会默认推荐优先使用async版本,调用传统带completion的接口就会触发Consider using asynchronous alternative function提示。
符合Swift规范的解决方案
按推荐优先级排序如下:
1. 调用自动生成的async版本接口(最推荐)
不需要等待执行结果的场景下,可以将async方法放到独立的Task中执行,外层不需要await这个Task就不会阻塞当前流程,完全符合Swift异步设计规范,无警告:
Task { let foo = await bar() // 原有异步逻辑 // 启动独立子Task执行目标方法,不会阻塞外层Task执行 Task { await noNeedToWaitForThis() } }
注:OC的noNeedToWaitForThisWithCompletion:方法桥接后会自动生成不带后缀的noNeedToWaitForThis() async方法,可直接调用。
2. 禁用OC方法的async桥接(适用于可修改OC源码的场景)
如果确定该方法不需要提供async调用入口,可以在OC方法声明中添加NS_SWIFT_ASYNC(never)注解,阻止Swift生成对应async版本,调用原completion接口就不会触发警告:
typedef void (^ResponseBlock)(BOOL success, id _Nullable object); - (void)noNeedToWaitForThisWithCompletion:(nullable ResponseBlock)completion NS_SWIFT_ASYNC(never);
3. 立即执行闭包(适用于无法修改OC源码的场景)
你目前使用的立即执行闭包写法是合规的,编译器不会对闭包内部的调用做async版本优先检测,添加注释说明用途即可:
Task { let foo = await bar() // 闭包包裹用于消除async版本优先调用警告 { noNeedToWaitForThis(completion: nil) }() }
内容的提问来源于stack exchange,提问作者arsenius
相关产品推荐
相关产品推荐

