SwiftUI - назначить вывод базы данных Firbase для модели данных - PullRequest
0 голосов
/ 20 января 2020

Я новичок в Swift и Firebase. И я пытаюсь понять это.

У меня есть база данных Cloud Firestore, где я храню некоторые пользовательские данные, такие как имя пользователя и адрес электронной почты. Теперь я хочу, чтобы выходные данные данного пользователя были назначены моей модели пользовательских данных для легкого использования. я действительно не знаю, как этого добиться.

Это мои два файла:

User.swift

import SwiftUI
import Firebase
import FirebaseFirestore


    struct User {

        var username : String
        var email : String
    }

GetData.swift

        let docRef = db.collection("users").document(Auth.auth().currentUser?.uid)

    docRef.getDocument { (document, error) in
        if let document = document, document.exists {
            let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
            print("Document data: \(dataDescription)")
        } else {
            print("Document does not exist")
        }
    }

Переменная dataDescription дает мне dictonaryArray со всеми необходимыми значениями , И теперь мне нужно присвоить этот Dictonary моей структуре User.swift.

С наилучшими пожеланиями!

FYI: Firebase Printscreen

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Я бы рекомендовал использовать Codable там, где вы можете. Я использую CodableFirebase Cocoapod, чтобы помочь с анализом Firebase. Ниже приведен пример, как использовать это:

    let docRef = db.collection("users").document(Auth.auth().currentUser?.uid)
    docRef.getDocument { (document, error) in

        guard let value = document.value, value as? NSNull == nil else {
            return
        }

        do {
            let newValue = try self.decoder.decode(User.self, from: value)
            ///New value created here
        } catch let error {
            print(error)
        }
    }

Вы можете сделать это более обобщенным c, пройдя через тип класса и получив необязательный возвращенный экземпляр:

    static func item<T: Codable>(_ item: T.Type, docRef: DatabaseReference, completion: @escaping ((Result<T?, Error>)->Void)) {

        docRef.getDocument { (document, error) in

                            guard let value = snapshot.value, value as? NSNull == nil else {
                    completion(.success(nil))
                    return
                }

                do {
                    let newValue = try self.decoder.decode(T.self, from: value)
                    completion(.success(newValue))
                } catch let error {
                    completion(.failure(error))
                }
        }
    }
0 голосов
/ 21 января 2020

try

GetData.swift

var user = User()
let docRef = db.collection("users").document(Auth.auth().currentUser?.uid)
docRef.getDocument { (document, error) in
    if let document = document, document.exists {
        let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
        print("Document data: \(dataDescription)")
        user.username = document.data(["username"]) as! String
        user.email= document.data(["email"]) as! String
    } else {
        print("Document does not exist")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...