SwiftUI Использовать EnvironmentObject в качестве модели для моей ViewModel - PullRequest
0 голосов
/ 24 марта 2020

У меня есть EnvironmentObject, который хранит пользовательские данные. После звонка на Firestore я заполняю его данными и использую везде. Проблема возникает в моей модели представления. Я легко могу извлечь данные из этой модели, но для более сложных вещей мне нужно использовать модель представления.

Может ли EnvironmentObject использоваться в качестве модели для модели представления или ее следует использовать только для локальных предпочтений в приложении, например, для хранения некоторых значений или предпочтений по умолчанию?

Лучше ли использовать отдельную модель для моей UserViewModel?

Хотя к его данным очень легко получить доступ, очень трудно заполнить их динамическими данными c после выполнения, например, внешнего вызова. Особенно в SceneDelegate, где это почти невозможно, потому что я не могу сделать там сетевой вызов.

SceneDelegate

let userData = UserData()

Auth.auth().addStateDidChangeListener { (auth, user) in
    if user != nil {
        if let userDefaults = UserDefaults.standard.dictionary(forKey: "userDefaults") {
            userData.profile = Profile(userDefaults: userDefaults)
            userData.uid = userDefaults["uid"] as? String ?? ""
            userData.documentReference = Firestore.firestore().document(userDefaults["documentReference"] as! String)
            userData.loggedIn = true
        }
    }
}

window.rootViewController = UIHostingController(rootView: tabViewContainerView.environmentObject(userData))

UserData

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("")

    @Published var savedItems = [SavedItem]()

    init(document: DocumentSnapshot? = nil) {
        if let document = document {
            print("document")
        let messagesDataArray = document["saved"] as? [[String: Any]]
        let parsedMessaged = messagesDataArray?.compactMap {
            return SavedItem(dictionary: $0)
        }
        self.savedItems = parsedMessaged ?? [SavedItem]()
        }
    }

}

UserViewModel

class UserViewModel: ObservableObject {
    @Published var userData: UserData?

    init(userData: UserData? = nil) {
        self.userData = userData
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...