У меня есть модель с именем UserData
, которая используется только для текущего зарегистрированного пользователя. Он сохраняет данные в виде данных профиля, идентификатора пользователя, ссылки на документ Firestore и т. Д. c.
Я внедряю это как @EnvironmentObject
, чтобы иметь доступ к нему везде.
final class UserData: ObservableObject {
@Published var profile = Profile.default
@Published var loggedIn: Bool = Auth.auth().currentUser != nil ? true : false
@Published var uid: String = ""
@Published var documentReference: DocumentReference = Firestore.firestore().document("")
}
У меня также есть UserViewModel с методами на нем.
class UserViewModel: ObservableObject {
func login(email: String, password: String, completion: @escaping (Response) -> Void) {
AuthService().login(email: email, password: password) { (response: Response) in
// let error = response.error
completion(response)
}
}
func register(email: String, password: String, firstName: String, lastName: String, completion: @escaping (Response) -> Void) {
AuthService().register(email: email, password: password, firstName: firstName, lastName: lastName) { (response: Response) in
// let error = response.error
completion(response)
}
}
func logout() {
try? Auth.auth().signOut()
}
}
Проблема возникает в представлении
@EnvironmentObject var userData: UserData
var userViewModel = UserViewModel()
func login() {
if self.email == "" || self.password == "" {
self.error = "You must provide both an email and password"
} else {
self.userViewModel.login(email: self.email, password: self.password) { response in
self.userData.profile = response.profile!
self.userData.uid = response.uid
self.userData.documentReference = response.documentReference ?? Firestore.firestore().document("")
UserDefaults.standard.set(response.userDefaults, forKey: "userDefaults")
}
}
}
Как видите, я не могу так легко обновить эту пользовательскую модель , Я должен обновить каждое из его свойств по одному, а также для регистрации я должен сделать то же самое. То же самое в SceneDelegate. У меня одни и те же строки в трех разных местах: вид входа в систему, вид регистрации и SceneDelegate
self.userData.profile = response.profile!
self.userData.uid = response.uid
self.userData.documentReference = response.documentReference ?? Firestore.firestore().document("")
UserDefaults.standard.set(response.userDefaults, forKey: "userDefaults")
Есть ли лучший способ справиться с такими вещами? Как наличие единого места для обновления @EnvironmentObject
. Они действительно крутые, чтобы использовать их в представлении, но обновление их вне представления представляет собой настоящую боль. Также это не очень хорошо работает с UserViewModel, так как я не могу передать UserData
в UserViewModel
.
Как правильно использовать эту @EnvironmentObject
под названием UserData