【问题标题】:SwiftUI - assign Firbase Database output to Data ModelSwiftUI - 将 Firebase 数据库输出分配给数据模型
【发布时间】:2020-05-06 16:19:00
【问题描述】:

我是 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")
        }
    }

Variable dataDescription 给了我一个字典数组,包含所有需要的值。现在我需要将该字典分配给我的 User.swift 结构。

最好的问候!

仅供参考:Firebase Printscreen

【问题讨论】:

    标签: ios database firebase google-cloud-firestore swiftui


    【解决方案1】:

    试试

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

    【讨论】:

      【解决方案2】:

      我建议尽可能使用 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)
              }
          }
      

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多