我將資料存盤在 Actor 中。我需要在視圖上顯示資料。我發現執行此操作的唯一方法是通過在 actor 上使用 await 命令來啟動任務以加載資料。這感覺不對,因為它很笨重;它也給了我一個我不明白的錯誤。
Mutable capture of 'inout' parameter 'self' is not allowed in concurrently-executing code
這是我的代碼:
actor SimpleActor
{
func getString() -> String
{
return "some value"
}
}
struct SimpleView: View
{
var actor: SimpleActor
@State var value: String
init()
{
actor = SimpleActor()
Task
{
value = await actor.getString() // error here
}
}
var body: some View
{
Text(value)
.width(100, alignment: .leading)
}
}
這樣做的最佳方法是什么?
uj5u.com熱心網友回復:
代碼中有很多問題。例如,您不能修改沒有標記為 的簡單屬性@State(Object)。并且您不能在Task.
基本上將演員宣告為@StateObject并采用ObservableObject
進一步獲取.task修飾符中的值,并賦予value默認值
actor SimpleActor : ObservableObject
{
func getString() -> String
{
return "some value"
}
}
struct DetailView: View
{
@StateObject var actor = SimpleActor()
@State private var value = ""
var body: some View
{
Group {
Text(value)
}.task {
value = await actor.getString()
}
}
}
uj5u.com熱心網友回復:
接近這個的東西將是做你想做的事情的常見方式。
actor SimpleActor: ObservableObject {
func getString() -> String {
return "some value"
}
}
struct SimpleView: View {
@StateObject var actor = SimpleActor()
@State var value: String = ""
var body: some View {
Text(value)
.frame(width: 100, alignment: .leading)
.task {
value = await actor.getString()
}
}
}
.task.onAppear是 iOS 15 ,所以如果您需要 iOS 13 ,可以回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536709.html
標籤:迅速苹果系统迅捷演员
下一篇:JSON寫入拋出無效型別
