如何重构if-else分支内重复的DispatchQueue.main.async逻辑
代码重构优化方案
下面是两种常用的优化方式,可根据实际业务场景选择:
方案1:抽取公共回调闭包
直接把两个分支重复的回调逻辑抽成单独变量,改动最小:
// 先定义公共的回调逻辑 let completion: (Error?) -> Void = { _ in DispatchQueue.main.async { inputBar.sendButton.stopAnimating() } } if isPostItem { DispatchQueue.global(qos: .background).async { [weak self] in self?.mainVM.postItems(id: itemId, completion: completion) } } else { DispatchQueue.global(qos: .background).async { [weak self] in self?.mainVM.retrieveItems(completion: completion) } }
方案2:统一分支逻辑,完全消除重复代码
提前确定要执行的业务方法,后续调度逻辑完全复用一套,代码更简洁:
// 先根据判断条件确定要执行的操作 let operation: (@escaping (Error?) -> Void) -> Void if isPostItem { operation = { [weak self] completion in self?.mainVM.postItems(id: itemId, completion: completion) } } else { operation = { [weak self] completion in self?.mainVM.retrieveItems(completion: completion) } } // 统一执行调度逻辑 DispatchQueue.global(qos: .background).async { operation { error in DispatchQueue.main.async { inputBar.sendButton.stopAnimating() } } }
额外优化点
- 原代码中
DispatchQueue.main.async捕获的[weak self]实际没有使用,如果inputBar不需要依赖当前类实例持有,可以直接移除[weak self]减少不必要的弱引用开销 - 如果项目中高频用到「后台队列执行任务+主线程回调更新UI」的逻辑,可以进一步封装成工具方法,减少调度代码的重复编写
内容的提问来源于stack exchange,提问作者hasan kaleli
相关产品推荐
相关产品推荐

