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