发布值时SwiftUI ObserveObject未更新

发布值时SwiftUI ObserveObject未更新,swiftui,observable,observableobject,observedobject,Swiftui,Observable,Observableobject,Observedobject,我有一个视图和一个viewModel,当用户添加到用户数组时,它应该更新ListView。我可以验证是否正在添加用户,但ObservedObject没有更新 我有一个搜索栏,可以让你搜索用户,然后更新ViewModel中的用户数组,该数组应该更新视图,但它没有 视图模型 class UsersViewModel: ObservableObject { @Published var users: [User] = [] @Published var isLoading = fals

我有一个视图和一个viewModel,当用户添加到用户数组时,它应该更新ListView。我可以验证是否正在添加用户,但ObservedObject没有更新

我有一个搜索栏,可以让你搜索用户,然后更新ViewModel中的用户数组,该数组应该更新视图,但它没有

视图模型

class UsersViewModel: ObservableObject {
    @Published var users: [User] = []
    @Published var isLoading = false
    var searchText: String = ""
    
    func searchTextDidChange() {
        isLoading = true
        API.User.searchUser(text: searchText) { (users) in
            self.isLoading = false
            self.users = users
        }
        // confirmed that users has data now at this point
    }
}
看法


尝试在主队列上更新

API.User.searchUser(text: searchText) { (users) in
   DispatchQueue.main.async {
      self.isLoading = false
      self.users = users
   }
}

您可能会遇到不同的UsersViewModel对象:

@ObservedObject var usersViewModel = UsersViewModel()

由于UsersView是一个结构,因此每次实例化视图时都会创建一个新模型(这种情况经常发生,而不仅仅是在视图出现时)。在iOS 14中,有
@StateObject
将状态(在视图实例化之间保留信息)与ObservedObject相结合,但在iOS 13中,如果ObservedObject不是共享实例,我建议传入它。

否。还是没什么,我想不是这个。这似乎是异步数据的问题。如果我在视图中创建一个按钮,然后让它在ViewModel中切换一个值,那么效果很好。但是如果我通过异步API调用运行它,它将不起作用(即使异步调用返回数据并更新发布的变量),如果我的理论正确,您可以通过在
UsersViewModel.init
中放置断点来检查。如果它多次触发,那么您就有这个问题(即使它不是这个特定错误的原因)。您确实是正确的。它被初始化了很多。那么你是说我应该在实例化视图之前创建ViewModel,然后只传入ViewModel?是的,这就是你想要做的(至少在iOS 13中)我通过NavigationBarButton中的NavigationLink输入视图。每当我点击NavigationBarButton时,它会被调用3次,因此即使我将UserViewModel()传递给视图,它仍然会被初始化多次,因为视图会被初始化多次,因为NavigationLin会被初始化多次,因为NavigationBarButton会被初始化多次
@ObservedObject var usersViewModel = UsersViewModel()