如何为默认函数添加async和await并保证正常调用?
解决InputBar代理方法加async后不触发的问题
问题根源很明确:你修改的是协议规定的同步代理方法,添加async关键字会改变函数的签名,导致它不再匹配协议中的方法定义,系统的代理回调机制找不到这个方法,自然不会被调用。
直接给你可行的解决方式:
- 保持原代理方法的签名完全不变(这是协议要求的),在方法内部通过
Task启动异步任务来处理逻辑。
示例代码:
// 严格遵循协议的代理方法,不能加async func inputBar(_ inputBar: InputBarAccessoryView, didPressSendButtonWith text: String) { // 用Task包裹异步操作,自动继承当前上下文(默认是主队列,适合后续更新UI) Task { // 调用单独的异步函数处理业务逻辑 await processSentText(text) // 异步任务完成后,可在这里做UI更新,比如清空输入框 inputBar.inputTextView.text = "" } } // 把异步逻辑抽成单独的私有函数 private func processSentText(_ text: String) async { // 这里写你的异步操作,比如发送网络请求 // await sendMessageToServer(text: text) }
为什么不能直接给代理方法加async?因为Swift的异步函数和普通函数属于不同的类型,协议里定义的是同步方法,你修改后的函数相当于一个全新的、不匹配协议的方法,代理回调时系统只会寻找符合协议签名的那个同步方法,自然不会触发你的异步版本。
内容的提问来源于stack exchange,提问作者Kristoffer Melen
相关产品推荐
相关产品推荐

