Как получить объект в Firestore (iOS) - PullRequest
0 голосов
/ 16 февраля 2020

Как получить объект в Firestore по его идентификатору в Swift? Затем мне нужно будет использовать этот объект для создания контента в пользовательском интерфейсе. Я использую SwiftUI. Объект, который я пытаюсь получить, - это пользователь, и он имеет следующую структуру:

struct AppUser: Codable {

    var id: String
    var displayName: String
    var photoURL: String
    var points: Int
    var knownLanguageCodes: Set<String>

}

Каждый документ в коллекции «users» имеет поля в структуре AppUser. В идеале я хотел бы написать функцию, которая возвращает объект AppUser из Firestore:

func getUser(withId id: String) -> AppUser {
    //I don't know how to write this function
}

Затем объект будет использоваться следующим образом:

struct ProfileHeadingView: View {

    let userId: String
    let user = getUser(withId: userId)

    var body: some View {
        HStack {
            ImageView(withURL: self.user.photoURL)
                .frame(width: 90, height: 90)
                .clipShape(Circle())
            VStack (alignment: .leading) {
                Text(self.user.displayName)
                    .font(.largeTitle)
                    .fontWeight(.heavy)
                HStack {
                    Text(String(self.user.points))
                        .font(.title)
                    Spacer()
                }
            }.padding(.horizontal)
        }
    }
}

1 Ответ

1 голос
/ 16 февраля 2020

Большинство API Firebase являются асинхронными - это связано с тем, что большинство из них связаны с сетевым вызовом, который намного медленнее, чем код выполняется на вашем телефоне!

Итак, ваш метод getUser потребуется переписать так:

import FirebaseFirestoreSwift

func getUser(userId: String, completion: @escaping (_ user: AppUser?, _ error: Error?) -> Void) {
  db.collection("users").document(userId).getDocument { (snapshot, error) in
    let user = try? snapshot?.data(as: AppUser.self)
    completion(user, error)
  }
}

Примечание: чтобы использовать поддержку Codable Firestore, вам нужно будет добавить pod 'FirebaseFirestoreSwift' к вашему Podfile

Что касается того, как (и когда) для извлечения пользователя, это в значительной степени зависит от того, является ли ProfileHeadingView частью представления списка (или выполняется переход из представления списка), или нет.

Если это является частью в виде списка, я бы рекомендовал извлекать всех пользователей одновременно - вы можете использовать прослушиватель снимков для прослушивания любых обновлений в коллекции пользователей или выполнить однократную выборку для чтения пользователей один раз .

Затем из представления списка передайте соответствующий объект user в ProfileHeadingView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...