【问题标题】:ListenerService Firebase not working with datesListenerService Firebase 不适用于日期
【发布时间】:2023-04-01 14:16:01
【问题描述】:

我的 firebase 条目有下一个模型,用于获取和获取数据:

struct MRecords: Hashable, Decodable {
var text: String
var date: Date
var id: String

init(text: String, date: Date, id: String) {
    self.text = text
    self.date = date
    self.id = id
}

init?(document: DocumentSnapshot) {
    guard let data = document.data() else { return nil}
    guard let text = data["text"] as? String,
    let date = data["date"] as? Date,
    let id = data["id"] as? String
    
    else { return nil }
    
    self.text = text
    self.date = date
    self.id = id
}

init?(document: QueryDocumentSnapshot) {
    let data = document.data()
    guard let text = data["text"] as? String,
    let date = data["date"] as? Date,
    let id = data["id"] as? String
    
    else { return nil }
    
    self.text = text
    self.date = date
    self.id = id
}

func hash(into hasher: inout Hasher) {
    hasher.combine(id)
}

static func == (lhs: MRecords, rhs: MRecords) -> Bool {
    return lhs.id == rhs.id
}

func contains(filter: String?) -> Bool {
    guard let filter = filter else { return true }
    if filter.isEmpty { return true }
    let lowercasedFilter = filter.lowercased()
    return text.lowercased().contains(lowercasedFilter)
}

}

我正在使用 Listener 来获取数据:

 func recordsObserve(records: [MRecords], completion: @escaping (Result<[MRecords], Error>) -> Void) -> ListenerRegistration? {
        var records = records
        let recordsRef = db.collection(["users", currentUserId, "records"].joined(separator: "/"))
        let recordsListener = recordsRef.addSnapshotListener { (querySnapshot, error) in
            guard let snapshot = querySnapshot else {
                print(1)
                completion(.failure(error!))
                return
            }
            
            snapshot.documentChanges.forEach { (diff) in
                guard let record = MRecords(document: diff.document) else { return }
                switch diff.type {
                case .added:
                    guard !records.contains(record) else { return }
                    records.append(record)
                case .modified:
                    guard let index = records.firstIndex(of: record) else { return }
                    records[index] = record
                case .removed:
                    guard let index = records.firstIndex(of: record) else { return }
                    records.remove(at: index)
                }
            }
            
            completion(.success(records))
        }
        
        return recordsListener
    }

在我的 ViewController 中,我使用下一个代码将数据放入数组:

waitingRecordsListener = ListenerService.shared.recordsObserve(records: records, completion: { (result) in
    switch result {
    case .success(let records):
        self.records = records
        self.tableView.reloadData()
    case .failure(let error):
        print(1)
    }
})

}

但它不起作用!如果我将模型日期属性类型从 Date 更改为 String,它就会开始工作。我怎样才能使它与日期类型一起工作,而不仅仅是字符串?

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    那是因为 Firebase 没有日期类型。您必须将其存储为 Firebase Timestamp 并计算并将其转换为日期格式。如果您想将日期值存储到 Firebase 中,这同样适用。然而,最好使用 firebase 函数 Timestamp 将数据存储到 firebase。

    【讨论】:

    • 你能写一些代码示例如何更改我的模型以使用时间戳吗?
    • @Parcker Firestore 入门指南中有一些代码展示了如何使用时间戳 - 请参阅 Data Types。 SO Timestamp 上也有很多示例
    猜你喜欢
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多