You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重构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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 02:06:02