首页 > 解决方案 > SwiftUI - 将 Firbase 数据库输出分配给数据模型

问题描述

我是 swift 和 Firebase 的新手。我试图理解它。

我有一个 Cloud Firestore 数据库,我在其中存储一些用户数据,例如用户名和电子邮件。现在我希望将给定用户的输出分配给我的 UserData 模型以便于使用。我真的不知道如何实现这一点。

这是我的两个文件:

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 给了我一个字典数组,包含所有需要的值。现在我需要将该字典分配给我的 User.swift 结构。

此致!

仅供参考:Firebase 打印屏幕

标签: iosdatabasefirebasegoogle-cloud-firestoreswiftui

解决方案


我建议尽可能使用 Codable。我正在使用CodableFirebaseCocoapod 来帮助进行 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)
        }
    }

您可以通过传递类类型并返回可选实例来使其更通用:

    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))
                }
        }
    }

推荐阅读