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
相关产品推荐
相关产品推荐

