如何在Swift5.5中将async/await与SwiftUI一起使用?
我一直在测试 Swift 5.5 版本中预览的异步/等待功能,但我无法从异步函数收集结果并使用 SwiftUI 显示它们。这是我的代码:
import SwiftUI
struct AsyncTestView: View {
@State var text: String?
// Async function
func asyncGetText() async -> String {
Thread.sleep(forTimeInterval: 10)
return "My text"
}
// Stores the result of async function
func fetchText() async {
let text = await asyncGetText()
DispatchQueue.main.async {
self.text = text
}
}
var body: some View {
Text(text ?? "Loading")
.onAppear(perform: fetchText)
}
}
这会导致以下错误:
在不支持并发的函数中调用 'async'
将 'async' 添加到函数 'fetchText()' 以使其异步
添加async到fetchText()函数然后会导致函数出现以下错误.onAppear():
从“() async -> ()”类型的“async”函数到同步函数类型“() -> Void”的无效转换
在本文中,他们使用@asyncHandler标记来注释fetchText函数,但这会导致警告:'@asyncHandler' has been removed from the language'。
回答
我是你引用的文章的作者。
正如在 SwiftUI中发现并发中所讨论的,视图可以使用 new.task { }和.refreshable { }修饰符来异步获取数据。
因此,您现在可以使用以下选项来调用异步代码:
func someSyncMethod() {
doSomeSyncWork()
async {
await methodThatIsAsync()
}
}
List {
}
.task {
await methodThatIsAsync()
}
List {
}
.refreshable {
await methodThatIsAsync()
}
如果您使用单独的视图模型,请确保将其标记为@MainActor确保在主要角色上执行属性更新。
我更新了我文章的代码:https : //github.com/peterfriese/Swift-Async-Await-Experiments
- I've totally lived through real code that did exactly this kind of thing (think successive online database calls that depend on one another). Combine framework saved me in the end, but async/await is _really_ going to save me. The truth is that 95% of programmers seem not even to understand what asynchronous means (hence my http://www.programmingios.net/what-asynchronous-means/), and with async/await, they won't have to!
回答
根据 WWDC 会话Meet async/await in Swift WWDC 中的新信息,在 23m:28s 现在使用:
async {
await someAsyncFunction()
}
会议截图。
THE END
二维码