【问题标题】: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。