如何为Swift函数/闭包添加completion handler完成回调
实现方案
分两种常见使用场景,你可以根据自己的需求选择:
场景1:在按钮点击逻辑执行完成后,直接触发后续回调操作
这是最常用的场景,不需要修改cell的原有buttonAction定义,只需要把赋值评论ID的逻辑和你写的带completion的方法结合,在核心逻辑跑完后调用回调即可:
// 你自己封装的评论选中处理逻辑,和你平时写completion函数的写法一致 func processSelectedComment(commentId: String, completion: (_ success: Bool) -> Void) { ViewComments.commentIDNew = commentId // 这里可以加ID校验、预加载评论数据等前置逻辑 let isIdValid = !commentId.isEmpty completion(isIdValid) } // 原有按钮点击赋值逻辑改造 cell.buttonAction = { [unowned self] in guard let selectedCommentId = table[indexPath.row].commentId else { print("评论ID为空,无法跳转") return } // 执行核心处理逻辑,完成后走回调 processSelectedComment(commentId: selectedCommentId) { success in guard success else { return } // 回调里写完成后要执行的操作,比如跳转评论页、刷新UI等 let commentVC = ViewComments() self.navigationController?.pushViewController(commentVC, animated: true) } }
注意:如果你的completion里包含异步操作(比如网络请求),需要给闭包参数加
@escaping标记,否则编译器会报错。
场景2:给cell的buttonAction本身扩展回调能力
如果你想让按钮点击事件把「操作完成」的状态回传给cell本身(比如点击后按钮显示loading,等跳转/请求完成后再恢复按钮状态),需要先修改cell内部buttonAction的闭包类型定义:
- 先改自定义Cell里的属性声明:
// 原buttonAction类型是 () -> Void,新增completion入参 var buttonAction: ((_ commentId: String, _ completion: @escaping (Bool) -> Void) -> Void)?
- 在Cell内部的按钮点击响应方法里,触发action时传入completion闭包:
@objc private func commentButtonTapped() { button.isUserInteractionEnabled = false // 防止重复点击 guard let currentCommentId = bindCommentId else { button.isUserInteractionEnabled = true return } // 调用外部实现的点击逻辑,传入回调入口 buttonAction?(currentCommentId, { [weak self] success in // 收到完成回调后恢复按钮状态 self?.button.isUserInteractionEnabled = true }) }
- 外部控制器里给
buttonAction赋值时,就可以在逻辑执行完主动调用completion通知cell:
cell.buttonAction = { [unowned self] selectedCommentId, completion in ViewComments.commentIDNew = selectedCommentId // 执行跳转/请求等逻辑 let commentVC = ViewComments() self.navigationController?.pushViewController(commentVC, animated: true) // 逻辑执行完成,调用completion通知cell completion(true) }
补充:闭包里用[unowned self]的时候要确保控制器不会在按钮点击逻辑执行完之前被释放,否则会出现野指针崩溃,不确定生命周期的场景建议换成[weak self]更安全。
内容的提问来源于stack exchange,提问作者submariner
相关产品推荐
相关产品推荐

