发布值时SwiftUI ObserveObject未更新
我有一个视图和一个viewModel,当用户添加到用户数组时,它应该更新ListView。我可以验证是否正在添加用户,但ObservedObject没有更新 我有一个搜索栏,可以让你搜索用户,然后更新ViewModel中的用户数组,该数组应该更新视图,但它没有 视图模型发布值时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
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()