我一直在测试 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”添加到函数“fetchText()”以使其异步
Adding async
to the fetchText()
然后函数会导致以下错误.onAppear()
功能:
从“() async -> ()”类型的“异步”函数到同步函数类型“() -> Void”的转换无效
In 本文 https://peterfriese.dev/async-await-in-swiftui/,他们使用@asyncHandler
标签来注释fetchText
函数,但这会导致警告:'@asyncHandler' has been removed from the language'
.
我是作者文章 https://peterfriese.dev/async-await-in-swiftui/你引用了。
正如中所讨论的探索 SwiftUI 中的并发性 https://developer.apple.com/videos/play/wwdc2021/10019,视图可以利用新的.task { }
and .refreshable { }
用于异步获取数据的修饰符。
因此,您现在可以使用以下选项来调用异步代码:
func someSyncMethod() {
doSomeSyncWork()
Task {
await methodThatIsAsync()
}
}
List {
}
.task {
await methodThatIsAsync()
}
List {
}
.refreshable {
await methodThatIsAsync()
}
如果您使用单独的视图模型,请确保将其标记为@MainActor
确保在主要参与者上执行属性更新。
我更新了我的文章的代码:https://github.com/peterfriese/Swift-Async-Await-Experiments https://github.com/peterfriese/Swift-Async-Await-Experiments
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)