После успешного входа в систему из Firestore я хочу вызвать свою /users
таблицу, чтобы получить дополнительные данные для этого пользователя. Например, рейтинг, savedItems и другие подобные вещи.
Я сделал то, что создал UserEnvironmentObject
, который, как следует из названия, имеет EnvironmentObject
. Я храню здесь User
, который я получаю из Firestore, а также ClientViewModel
ClientViewModel также используется, например: когда пользователь запрашивает профиль другого пользователя, поэтому я пошел с этим подход, чтобы повторно использовать мою существующую ClientViewModel. Однако проблема в том, что я не считаю нормально иметь ObservableObject внутри EnvironmentObject. Есть ли лучший способ добиться этого?
class UserEnvironmentObject: ObservableObject {
@Published var user: User?
@Published var clientViewModel: ClientViewModel?
var handle: AuthStateDidChangeListenerHandle?
func listen() {
handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
self.user = user
self.firestoreService.fetchDocument(documentReference: documentReference) { (result: Result<Client, Error>) in
switch result {
case .success(let client):
let clientViewModel = ClientViewModel(client: client)
self.savedItems = client.savedItems
self.rating = clientViewModel.rating
case .failure(let error):
print(error.localizedDescription)
}
}
})
}
}
class ClientViewModel: ObservableObject {
@Published var client: Client?
var firestoreService: FirestoreService = FirestoreService()
init(client: Client?) {
self.client = client
}
var rating: String {
guard let ratings = client?.ratings else { return "5.0" }
return Double(ratings.reduce(0, +) / ratings.count).roundToDecimal(1).description
}
func loadClient(documentReference: DocumentReference?) {
if let documentReference = documentReference {
firestoreService.fetchDocument(documentReference: documentReference) { (result: Result<Client, Error>) in
switch result {
case .success(let client):
self.client = client
case .failure(let error):
print(error.localizedDescription)
}
}
}
}
}