我希望在函数完成后继续每隔5秒触发一次该函数。
以前,我会在函数末尾使用以下代码:
Timer.scheduledTimer(withTimeInterval: 5, repeats: false) { self.function() }
但是我想使用 Swift 5.5
的 async/await
特性。
如果我使用类似下面的代码:
func loadInfo() async {
async let info = someOtherAsyncFunc()
self.info = try? await info
await Task.sleep(5_000_000_000)
await loadInfo()
}
我收到一个警告,说函数调用导致无限递归
,而且它不是真正可取消的。
这个可以成功编译:
func loadInfo() async {
Task {
async let info = someOtherAsyncFunc()
self.info = try? await info
await Task.sleep(5_000_000_000)
if Task.isCancelled {
print("Cancelled")
}
else
{
print("Not cancelled")
await loadInfo()
}
}
}
尽管它每5秒会触发一次,但当我的 SwiftUI
视图被关闭时,它仍在运行。我使用以下方式启动它:
.onAppear {
loadInfo()
}
由于所有内容都在同一个 Task
上运行,而不是 detached
,那么当视图被移除时,它不应该全部取消吗?
使用 async/await
实现这一点的现代方法是什么?
loadInfo()
函数不是异步的,所以我需要使用.onAppear
而不是.task
。 - Darren.task(_:)
编译通过,但在 Xcode 13b5 上不行。 - George