Composable Architecture 1.0中替代fireAndForget执行无反馈代码的方法
在Composable Architecture 1.0中执行无反馈代码的推荐方式
TCA 1.0弃用Combine后,官方不再推荐Effect.fireAndForget,转而使用基于Swift Concurrency的Effect.run方法来执行不需要向Reducer反馈动作的代码。以下是具体的非异步和异步代码示例:
非异步代码示例
直接在run闭包中同步执行代码即可,闭包天然支持async上下文,同步逻辑无需额外处理:
Reducer { state, action, environment in switch action { case .performSyncTask: return .run { send in // 执行同步任务:比如打印日志、修改本地存储 print("执行同步无反馈任务") UserDefaults.standard.set(true, forKey: "taskFinished") // 不需要反馈时,完全不用调用send() } // 其他action分支处理 } }
异步代码示例
如果要执行异步操作(比如网络请求、耗时IO),直接在run闭包中用await标记异步调用即可,无需额外的Combine包装:
Reducer { state, action, environment in switch action { case .performAsyncTask: return .run { send in do { // 调用环境中的异步方法 try await environment.apiClient.submitData() print("异步任务完成,无反馈") } catch { // 仅处理错误日志,不向Reducer发送动作 print("异步任务失败:\(error.localizedDescription)") } // 全程不调用send(),实现无反馈效果 } // 其他action分支处理 } }
关键说明
Effect.run的闭包参数send用于向Reducer发送动作,不需要反馈时完全可以忽略它,这就等价于原来fireAndForget的作用。- 所有异步逻辑都遵循Swift Concurrency的规则,比如用
await等待异步结果、用do/catch处理错误。
内容的提问来源于stack exchange,提问作者Small Talk
相关产品推荐
相关产品推荐

