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