Как использовать кодируемую временную метку firebase в ios swift5? - PullRequest
1 голос
/ 19 сентября 2019

Я пытаюсь расшифровать коллекцию firebase с помощью FirebaseDecoder().Вот модель, которую я использовал

Метод 1

struct firebaseApplication:Codable {

var uid:String?
var status:String?
var jobId:String?
var companyId:String?
var createdDate: Timestamp? // or  //    Date? // or // String?

}

Если я прокомментирую createDate , тогда результат получен.В противном случае нет результата.Я попытался дать createDate как Timestamp? и Date? и string?, все случаи безрезультатно.

я попробовал другой способ, он работает нормально, вот он

Метод 2

struct ApplicationCollection:CustomStringConvertible {
var description: String
var uid: String
var status:String
var jobId:String
var companyId:String
var createdDate:Date

init(Dict:[String:Any]) {

    self.uid = Dict["uid"] as? String ?? ""
    self.status = Dict["status"] as? String ?? ""
    self.jobId = Dict["jobId"] as? String ?? ""
    self.companyId = Dict["companyId"] as? String ?? ""
    let str = Dict["createdDate"] as? Timestamp ?? Timestamp()
    self.createdDate = str.dateValue()
    self.description = "[uid: \(uid),status: \(status),jobId: \(jobId),companyId: \(companyId),createdDate: \(createdDate)]"

}

init?(data: Data) {
    guard let json = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any] else { return nil }
    self.init(Dict: json)
}
init?(json: String) {
    self.init(data: Data(json.utf8))
}
}

Метод 2 работает нормально, получая все данные вместе с createDate

почемув метод 1 , в случае не получения createDate ?.Я что-то пропустил?

Как это решить

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Я использовал проект https://github.com/alickbass/CodableFirebase, чтобы сэкономить много кода вокруг такого рода вещей.Это действительно помогло в работе с FireStore, а также обрабатывает метки времени.

0 голосов
/ 23 сентября 2019

Я нашел решение моего вопроса.

Я ошибся, при расшифровке Timestamp() мы должны использовать FirestoreDecoder() вместо FirebaseDecoder.

Вот оно, я изменилот firebase до firestore

let decoder = FirebaseDecoder()
                let data = try decoder.decode(firebaseApplicationCollection.self, from: i.data())

вместо

let decoder = FirestoreDecoder()
                let item = try decoder.decode(firebaseApplicationCollection.self, from: i.data())

Надеюсь, этот ответ поможет другим определить точную проблему при расшифровке Timestamp в базе данных

0 голосов
/ 20 сентября 2019

Похоже, что метод 2 работает, потому что вы вручную отображаете переменные с помощью пар ключ / значение.

Метод 1 может не работать, потому что вы пытаетесь сопоставить строку с пользовательским типом (не уверенесли TimeStamp кодируется или нет, так как реализация не предусмотрена) вместо необработанной строки это так.Возможно, установите дату создания в виде строки в методе один и создайте метод доступа () для объекта даты в этой строке.

Метод 2 выглядит так, как будто вы знаете, что это строка, но задайте для параметра creatDate значениеdateValue этой отметки времени, поскольку типы совпадают.

Можете ли вы опубликовать свою реализацию отметки времени для просмотра?

...