Сохранение информации о пользователе в Firestore - PullRequest
0 голосов
/ 27 апреля 2020

Я создал пользователя с помощью Firestore, но не могу сохранить его в структуре, чтобы позже получить имя пользователя для метки. Как мне это решить?

//create the user
Auth.auth().createUser(withEmail: email, password: password) { (result, err) in
    print(result)
    //check for errors
    if err != nil {
        //there was an error while creating user
        self.showError("Error creating user")
    }//end if
    else {
        //user was created successfully, store name, last name and email
        let db = Firestore.firestore()
        db.collection("users").addDocument(data: ["firstName": firstName, "lastName": lastName, "age": age!, "imageUrl": imageUrl, "email": email, "uid": result!.user.uid]) { (error) in

            if error != nil {
                //show error message
                self.showError("Account created, but database couldn't save name")
            }//end of if
        }//end of db collection

        //save current user
        //This is where I would like to save my user to my struct

        //transition to homescreen
        self.transitionToTabBarVC()
    }//end else

}//end of create user

1 Ответ

0 голосов
/ 27 апреля 2020

Вы можете получить информацию о профиле пользователя, например, так:

let user = Auth.auth().currentUser
if let user = user {
  let uid = user.uid
  let email = user.email
  let photoURL = user.photoURL
  let displayName = user.displayName
}

Если вы хотите сохранить дополнительную информацию о профиле c, указанную в приложении (например, его любимый цвет или что-либо еще, заданное c) для вашего приложения), я бы рекомендовал хранить это в коллекции в Firestore, которая не с именем users, чтобы избежать путаницы. Назовите его, например, profiles.

Затем создайте класс ProfileRepository, который выбирает профиль пользователя следующим образом:

import FirebaseFirestoreSwift

struct UserProfile: Codable {
  var favouriteColour: String
}

class ProfileRepository {

  func getUserProfile(completion: @escaping  (_ profile: UserProfile) -> Void) {
    if let uid = Auth.auth().currentUser?.uid {
      let profileRef = Firestore.firestore().collection("profiles").document(uid)
      profileRef.getDocument { (documentSnapshot, error) in
        do {
          if let profile = try documentSnapshot?.data(as: UserProfile.self) {
            completion(profile)
          }
        }
        catch {
          print(error)
        }
      }
    }
  }

}

Имейте в виду, что, поскольку большинство API-интерфейсов Firebase асинхронный, вам нужно будет использовать механизм обратного вызова, чтобы вернуть профиль вызывающей стороне. Здесь я использовал замыкание (которое мне лично нравится намного больше, чем делегатам).

Я также использую поддержку Firebase для Codable, поэтому вам придется добавить эту строку в свой Podfile:

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