Swiftui 观察到的对象未触发视图重画

Swiftui 观察到的对象未触发视图重画,swiftui,publish,observableobject,Swiftui,Publish,Observableobject,我有一个视图需要从api获取数据。 我对SwiftUI的理解是,通过使用onAppear,将调用api,更新viewmodel属性,并更改StateObject,从而触发视图重画 问题是没有进行重新绘制 我可以看到一个api调用正在发生,在使用解码的数据之后,我可以看到大量数据被返回 我删除了很多代码,以使逻辑更容易理解(如下) 将@StateObject替换为@ObservedObject并从父对象传递到视图中也没有什么区别 谢谢 struct FactoryDetailView: View

我有一个视图需要从api获取数据。 我对SwiftUI的理解是,通过使用onAppear,将调用api,更新viewmodel属性,并更改StateObject,从而触发视图重画

问题是没有进行重新绘制

我可以看到一个api调用正在发生,在使用解码的数据之后,我可以看到大量数据被返回

我删除了很多代码,以使逻辑更容易理解(如下)

将@StateObject替换为@ObservedObject并从父对象传递到视图中也没有什么区别

谢谢

struct FactoryDetailView: View {

  var factory: Factory
  @StateObject var factoryDetailsViewModel: FactoryDetailsViewModel()

  var body: some View {

     VStack {
        Text(factory.name)
        ForEach(factoryDetailsViewModel.details) { det in
          Text(det)
        }
     }
     .onAppear { factoryDetailsViewModel.loadDetails(factory) }
  }
}
viewmodel:

class FactoryDetailsViewModel: ApiViewModel {
  @Published var details: [ String ]
  func loadDetails(factory: Factory) {

     // Do api call...

     self.objectWillChange.send()
     self.details = decodedResultsFromApiCall
     self.objectWillChange.send()
}

嗯。。。删除的细节可能是问题的原因,但通常的方法应该如下所示

struct FactoryDetailView: View {
  ...
  // assume it is a type and here there is initialization 
  @StateObject var factoryDetailsViewModel = FactoryDetailsViewModel()
  ...
现在关于self.objectWillChange.send()-不要调用它,修改发布的属性会自动调用它

func loadDetails(factory: Factory) {

     // Do api call...
     { 
          // this is inside (!) API callback
          DispatchQueue.main.async {
             // update published property on main queue, always.
             self.details = decodedResultsFromApiCall
          }
     }
}
答案是:

我看到的问题是相同的——子类化一个ObservieObject

我现在有了一个解决方案,它是在父类中使用“@Published var api_response”,并从子类的属性中删除@Published(尽管在子类中保留“@Published”似乎不会产生任何副作用,因此它们也可以保留,如果只是为了记录意图的话)


感谢您的回复。

谢谢。我刚刚发现,如果删除“@Published”,它可以工作,但需要objectWillChange.send()调用。我想一定有一些时候你不能使用'@Published'包装器。我试图避免手动调用objectWillChange,因为这似乎违背了应该做的事情。
func loadDetails(factory: Factory) {

     // Do api call...
     { 
          // this is inside (!) API callback
          DispatchQueue.main.async {
             // update published property on main queue, always.
             self.details = decodedResultsFromApiCall
          }
     }
}