SwiftUI Firebase — Присвоение значения по умолчанию типу данных метки времени Firebase

# #swift #firebase #google-cloud-firestore #timestamp #codable

Вопрос:

У меня возникли проблемы с присвоением значения по умолчанию типу данных метки времени Firebase

Это моя модель:

 import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift

struct MiniSite: Codable, Identifiable {
       
    @DocumentID var id: String?
    var name:String
    var city: String
    var country: String
    var region: String? = ""
    @ServerTimestamp var createDate: Timestamp?   
   
}

 

Мои данные Firebase выглядят так:

 name:"Clerigos Tower"
city :"Porto",
country:"Portrugal",
createDate: "March 3, 2021 at 4:19:53 PM UTC 2"(timestamp)
 

Мой код для чтения данных Firebase взят из видео Питера Фриза «Создайте приложение со списком дел с помощью SwiftUI и Firebase».

 import Foundation
import Firebase
import FirebaseFirestore
import FirebaseFirestoreSwift

class MSiteRepository: ObservableObject {
    let db = Firestore.firestore()
    
    
    @Published var sites = [MiniSite] ()
    func loadData() {
        db.collection("sites")
            .addSnapshotListener { (querySnapshot, error) in
                if let querySnapshot = querySnapshot {
                    self.sites = querySnapshot.documents.compactMap { document in
                        do {
                            let x = try  document.data(as: MiniSite.self)
                            return x
                        }
                        catch {
                            print(error)
                        }
                        return nil
                    }
                }
            }
    }
}
 

Если моя запись содержит дату создания, то все работает нормально. Но CreateDate является необязательным в моей базе данных, поэтому я определил его в своей модели соответствующим образом
@ServerTimestamp var createDate: Timestamp?

Если документ в Firebase не содержит поля CreateDate, во время декодирования я получаю следующую ошибку:

keyNotFound(CodingKeys(stringValue: "createDate", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "createDate", intValue: nil) ("createDate").", underlyingError: nil))

Это нормально, что CreateDate равен нулю для тех записей, в которых нет поля CreateDate. Проблема в том, что эти записи не добавляются в массив моих сайтов.

Я попробовал следующее:

  1. Добавление значения по умолчанию для CreateDate

@ServerTimestamp var createDate: Timestamp?=nil

  1. Добавление перечисления кодовых ключей
 import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift

struct MiniSite: Codable, Identifiable {
       
    @DocumentID var id: String?
    var name:String
    var city: String
    var country: String
    var region: String? = ""
    @ServerTimestamp var createDate: Timestamp?
    
    enum CodingKeys: String, CodingKey {
        case name
        case city
        case country
        case createDate
    }
    
}

 

Ни то, ни другое не оказало никакого влияния на результаты

Мне не нужно обновлять базу данных, поэтому я также попытался удалить метку @ServerTimestamp из поля CreateDate. Это тоже не помогло

Комментарии:

1.Вы пробовали удалить @ServerTimestamp и сделать его необязательным ( Timestamp? )?

2. Нет, я этого не пробовал, и это решает проблему. Спасибо @jnpdx за вашу помощь!

Ответ №1:

Как указано @jnpdx в комментариях, решение состоит в том, чтобы удалить аннотацию @ServerTimestamp и использовать необязательную метку времени.

Изменить

     @ServerTimestamp var createDate: Timestamp?
 

Для

     var createDate: Timestamp?