Во время изучения Flutter я наткнулся на InheriredModel/Widget
, и я смог использовать его для хранения пользовательского документа в качестве модели и доступа к нему в любом месте приложения без необходимости вызывать Firestore (чтобы избежать увеличения чтения).Я пытался найти что-то подобное в Swift, но не смог.
Есть ли способ сделать это, чтобы прочитать документ текущего пользователя, преобразовать его в модель и сохранить его, чтобы я мог получить к нему доступ в любом контроллере представления.
Вот так я получаю текущего пользователя и получаю его как модель.
Вызов
func currentUser(onSuccess: @escaping (User_) -> Void, onFailure: @escaping (String) -> Void) {
Services.crud.read(ref: self.currentUserRef, onSuccess: { (snapshot) in
if let dict = snapshot.data() {
onSuccess(User_.transform(id: snapshot.documentID, dict: dict))
}
}) { (e) in
onFailure(e)
}
}
Модель
User_ {
var userID: String?
var aviURL: String?
var name: String?
var phone: String?
var email: String?
var location: Location_?
var createdAt, updatedAt: Timestamp?
var asDictionary: [String: Any] {
return Dictionary(uniqueKeysWithValues: Mirror(reflecting: self).children.lazy.map({ (label: String?, value: Any) -> (String, Any)? in
guard label != nil else { return nil }
return (label!, value)
}).compactMap{ $0 })
}
}
Я пытался использовать UserDefaults, ноЯ не могу сохранить модель User_
.Я попытался преобразовать его обратно в словарь и сохранить его, но он все равно не работает.
APIs.users.currentUser(onSuccess: { (user) in
UserDefaults.standard.setValue(user, forKey: Config.UserDefaults.cUser) // Don't Work
UserDefaults.standard.setValue(user.asDictionary, forKey: Config.UserDefaults.cUser) // Don't Work
UserDefaults.standard.synchronize()
}, onFailure: { (error) in
print(error)
})