簡體   English   中英

為什么 SwiftUI 沒有設置來自解碼 JSON 的 state 變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM