我在 SwiftUI 中的
.refreshable()
上使用 List
。使用以下代码,我在 iOS 17.4 模拟器中拉动刷新,微调器出现,然后在几秒钟后消失。
var body: some View {
List() {
// items ...
}
.refreshable { try? await Task.sleep(nanoseconds: 3_000_000_000) }
}
但是,当我将实际的刷新逻辑放入
refreshable
函数中时,旋转器不再消失,即使我的刷新函数完成时没有错误(我使用 Xcode 中的断点进行了验证)。相反,旋转器只会永远旋转。
var body: some View {
List() {
// items ...
}
.refreshable { await query.refetchAsync() }
}
query.refetchAsync()
触发在后台运行的重新获取 Task
,然后通过迭代 NotificationCenter.notifications()
返回的对象来等待更新:self.client.queryUpdatesAsync()
如何修复这个错误?
public func refetchAsync() async {
self.refetch()
for await update in self.client.queryUpdatesAsync() {
if update.key != self.key { continue }
switch self.dataStatus {
case .idle, .pending: continue
default: break
}
}
}
中的
break
会破坏 switch,而不是 for 循环。要解决这个问题,您可以使用带标签的语句:switch self.dataStatus {