У меня есть 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
}