如何使用TCA Effect的.throttle实现带节流的搜索功能
用The Composable Architecture的Effect.throttle实现输入暂停后过滤集合
直接替换你现有方案的代码如下:
case .queryChanged(let newQuery): state.query = newQuery return .run { [items = state.items, query = newQuery] send in await send(.filterItems(items.filter(by: query))) } .throttle( id: CancelID.search, for: Constant.MY_DELAY, scheduler: DispatchQueue.main, latest: true )
关键说明
- 用
.throttle替代Task.sleep+cancellable的组合,更贴合TCA的Effect调度逻辑 id: CancelID.search:和你原来的取消ID保持一致,确保重复触发输入变更时,自动取消之前未执行的过滤请求for: Constant.MY_DELAY:设置输入暂停后等待的时长,和你原来的延迟值对应scheduler: DispatchQueue.main:指定过滤完成后发送动作的调度队列,因为涉及UI更新,主队列是常规选择latest: true:只保留最新的过滤请求,完全符合「输入暂停后执行最新过滤」的需求,中间的输入变更会被自动忽略
方案优势
原来的Task.sleep方案是每次输入都启动一个延迟任务,再通过cancellable取消旧任务,而.throttle是TCA内置的操作符,专门处理这类「节流」场景,逻辑更简洁,也更符合框架的设计理念,不需要手动管理Task的生命周期。
内容的提问来源于stack exchange,提问作者sergeifabian
相关产品推荐
相关产品推荐

