问题描述
我有一个视图和一个viewmodel,当将用户添加到用户数组时,它们应该更新ListView。我可以确认正在添加用户,但是Observedobject没有更新。
我有一个搜索栏,可让您搜索用户,然后在viewmodel中更新用户数组,这应该会更新View,但不会。
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
}
}
查看
struct UsersView: View {
@Observedobject var usersviewmodel = Usersviewmodel()
var body: some View {
vstack() {
SearchBarView(text: $usersviewmodel.searchText,onSearchButtonChanged: usersviewmodel.searchTextDidChange)
// Not getting called after usersviewmodel.users gets data
if (usersviewmodel.users.count > 0) {
Text(usersviewmodel.users[0].username)
}
}
}
}
解决方法
尝试在主队列上更新
API.User.searchUser(text: searchText) { (users) in
DispatchQueue.main.async {
self.isLoading = false
self.users = users
}
}
,
您可能最终会使用不同的UsersViewModel对象:
@ObservedObject var usersViewModel = UsersViewModel()
由于UsersView是一个结构,因此每次实例化View时都会创建一个新模型(这种情况可能经常发生,而不仅是在视图出现时)。在iOS 14中,有@StateObject
可以将State(保留View实例之间的信息)与ObservedObject结合起来,但是在iOS 13中,如果不是共享实例,我建议传入ObservedObject。