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

SwiftUI中.refreshable()加载指示器无法自动消失的问题修复

问题修复方案

你的问题根源在于refetchAsync()函数中的for await循环没有终止条件——它会一直监听queryUpdatesAsync()返回的通知序列,导致.refreshable的闭包永远无法执行完毕,所以下拉刷新指示器会持续旋转。

修复步骤:

  • 明确数据刷新完成的状态(比如dataStatus的.success或.failure),在循环中检测到该状态时立即终止循环。
  • 确保refetch()触发的后台操作完成后,dataStatus会正确更新为对应完成状态。

修改后的refetchAsync()代码示例:

public func refetchAsync() async {
  self.refetch()
  
  for await update in self.client.queryUpdatesAsync() {
    // 只处理当前query的更新
    guard update.key == self.key else { continue }
    
    switch self.dataStatus {
    case .idle, .pending:
      // 刷新还在进行,继续等待
      continue
    case .success, .failure:
      // 刷新已完成,终止循环,让refreshable闭包结束
      return
    }
  }
}

额外注意事项:

  • 如果queryUpdatesAsync()返回的是无限序列,必须通过明确的条件终止循环,否则异步任务会一直挂起。
  • 确认refetch()触发的后台任务完成时,会正确更新dataStatus,确保循环能检测到终止信号。

内容的提问来源于stack exchange,提问作者laptou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:03:19