SwiftUI Firestore получает данные пользователя после входа в систему - PullRequest
0 голосов
/ 29 мая 2020

После успешного входа в систему из 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)
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 29 мая 2020

Что вас беспокоит по поводу наличия ObservableObject в environmentObject? Реализация шаблона, подобного Redux, требует того же подхода, и я делал это в своих проектах. https://tech.mercari.com/entry/2019/12/11/150000

Одна небольшая проблема для этой ситуации: все представления swiftUI должны иметь доступ к объектам среды, однако в настоящее время представления Sheet этого не делают. чтобы исправить это, вы передаете объект среды явно следующим образом:

@EnvironmentObject var store: AppStore

.sheet(isPresented: $someBoolean, content: { SomeView().environmentObject(self.store)})
...