[英]Why is SwiftUI not setting a state variable from decoded JSON?
我正在嘗試下載 JSON 名字列表並使用它們隨機選擇一個名字。 但是,當我在調試器中單步執行時,我發現 self.names 未設置為已解析的 JSON。這是為什么?
struct ContentView: View {
@State var names:[String] = []
init(){
getNames()
}
var body: some View {
List {displays person objects from coredata}
Button(action: addItem)
}
func getNames(){
// URL & JSON setup
session.dataTask(with: request) { data, response, error in
guard error == nil else {return}
do {
let decoder = JSONDecoder()
let decodedNames = try decoder.decode([String].self, from: data!)
DispatchQueue.main.async {
self.names = decodedNames // self.names not being set here
}
}
catch {}
}.resume()
}
func addItem() {
let p = Person(context: viewContext)
p.age = String(Int.random(in: 1...100))
p.name = self.names[Int.random(in: 0..<self.names.count)] // crashes here
try! viewContext.save()
}
SwiftUI 中的視圖沒有保證的生命周期。 它們本質上是可傳遞的,系統可以隨時重建它們。 如果視圖中有異步方法,則不能保證視圖的同一實例在返回時會存在於層次結構中。
出於這個原因,通常建議您將異步代碼移動到視圖 model(具有@Published
屬性的ObservableObject
)。 ObservableObject
將具有保證的生命周期,並且可以通過@Published
屬性將數據傳回視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.