【问题标题】:Unable to retrieve timestamp data on Firebase to SwiftUI无法将 Firebase 上的时间戳数据检索到 SwiftUI
【发布时间】:2020-06-26 08:41:31
【问题描述】:

我一直在尝试将我在 Firebase 上的时间戳数据检索到 SwiftUI,但一直遇到错误:无法将类型“FIRTimestamp”(0x107db0b88)的值转换为“FIRTimestamp”(0x10d78ec58)

这对我来说很奇怪,因为 Swift 似乎无法解开我的时间戳数据,尽管它是正确的类型。

这是我遇到问题的代码的 sn-p:

for i in query!.documentChanges {
  let dateOfConsumption = i.document.get("date of consumption") as! Timestamp 

【问题讨论】:

    标签: swift firebase google-cloud-firestore timestamp swiftui


    【解决方案1】:

    我建议使用FirebaseFirestoreSwift,这样您就可以使用Codable 将您的文档映射到 Swift 结构,如下所示:

    您的 Podfile:

    platform :ios, '13.0'
    
    target 'MakeItSo' do
      # Comment the next line if you don't want to use dynamic frameworks
      use_frameworks!
    
      # Pods for MakeItSo
      
      pod 'Firebase/Analytics'
      pod 'Firebase/Firestore'
      pod 'FirebaseFirestoreSwift'
    end
    

    您的模型:

    import Foundation
    import FirebaseFirestore
    import FirebaseFirestoreSwift
    
    enum TaskPriority: Int, Codable {
      case high
      case medium
      case low
    }
    
    struct Task: Codable, Identifiable {
      @DocumentID var id: String?
      var title: String
      var priority: TaskPriority
      var completed: Bool
      @ServerTimestamp var createdTime: Timestamp?
      var userId: String?
    }
    

    您的视图模型:

    class FirestoreTaskViewModel:  ObservableObject {
      var db = Firestore.firestore()
    
      var tasksPath: String = "tasks"
      var userId: String = "unknown"
      
      private var listenerRegistration: ListenerRegistration?
      private var cancellables = Set<AnyCancellable>()
      
      func loadData() {
        if listenerRegistration != nil {
          listenerRegistration?.remove()
        }
        listenerRegistration = db.collection(tasksPath)
          .whereField("userId", isEqualTo: self.userId)
          .order(by: "createdTime")
          .addSnapshotListener { (querySnapshot, error) in
            if let querySnapshot = querySnapshot {
              self.tasks = querySnapshot.documents.compactMap { document -> Task? in
                try? document.data(as: Task.self)
              }
            }
          }
      }
    

    这将自动映射您的时间戳。

    请参阅Connecting SwiftUI and Cloud Firestore 了解如何构建从 Cloud Firestore 获取数据的 SwiftUI 应用程序的深入演练,以及了解如何将 Codable 与 Firestore 结合使用的Mapping Firestore Documents using Swift Codable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2022-11-20
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多