SwiftUI Обновление EnvironmentObject вне представления - PullRequest
1 голос
/ 22 марта 2020

У меня есть модель с именем 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...