Как использовать FieldValue.serverTimestamp () как класс Model в iOS - swift - PullRequest
0 голосов
/ 17 сентября 2018

Я использую Firestore в качестве базы данных, и теперь я хочу сохранить временную метку сервера при регистрации пользователя.Этот вопрос противоположен Android

FieldValue.serverTimestamp()

Это класс модели

struct NotificationModel: Identifiable, Codable {
   var id: String? = nil
   var title: String?
   var body: String?
   var timestamp: Date?

   init(title: String, body: String, timestamp: Date) {
       self.title = title
       self.body = body
       self.timestamp = timestamp
   } 
}

Я хочу эту отметку времени в своем классе моделей.

Как я могу добиться чего-то подобного?

.document(ID).collection("notifications").order(by: "timestamp", descending: true).addSnapshotListener { (snapshot, error) in

Это целый код, который я decode документ от Firestore до Json

func readUserNotifications<T: Decodable>(from collectionReference: FIRCollectionReference, get userId: String, returning objectType: T.Type, fromType collectionCell: FIRCollectionCell, completion: @escaping ([T], _ sucess: Bool) -> Void)  {


    collectionReferences(to: collectionReference).document(userId).collection("notifications").order(by: "timestamp", descending: true).addSnapshotListener { (snapshot, error) in
        var objectsAppend = [T]()
        if let error = error {
            print(error.localizedDescription)
        }
        guard let snapshot = snapshot else {
            print("Doesn't have snapshot")
            return
        }
        do {
            for document in snapshot.documents {

                //print(try document.decode(as: NotificationModel.self))
                let object = try document.decode(as: objectType.self, includingId: true)
                objectsAppend.append(object)
            }
            if objectsAppend.isEmpty {
                objectsAppend.removeAll()
                completion(objectsAppend, false)
            } else {
                completion(objectsAppend, true)
            }
        } catch {
            print(error)
        }
    }

}

Вот моя decode функция, котораяошибка там

extension DocumentSnapshot {

func decode<T: Decodable>(as objectType: T.Type, includingId: Bool = true) throws  -> T {

    var documentJson = data()
    if includingId {

        documentJson["id"] = documentID
    }

    let documentData = try JSONSerialization.data(withJSONObject: documentJson, options: [])
    let decodedObject = try JSONDecoder().decode(objectType, from: documentData)

    return decodedObject
}

}

1 Ответ

0 голосов
/ 18 сентября 2018

Попробуйте: предположим, что у нас есть структура Firestore (как показано в консоли Firestore)

timestamps
   stamp_0
      stamp: September 18, 2018 at 8:00:00 AM UTC-4
   stamp_1
      stamp: September 18, 2018 at 8:01:00 AM UTC-4
   stamp_2
      stamp: September 18, 2018 at 8:02:00 AM UTC-4

и мы хотим прочитать метки времени и распечатать ключ и отформатированную метку времени на консоли.

self.db.collection("timestamps").getDocuments() { (querySnapshot, err) in
    if let err = err {
        print("Error getting documents: \(err)")
    } else {
        for document in querySnapshot!.documents {
            if let stamp = document.get("stamp") {
                let title = document.documentID
                let ts = stamp as! Timestamp
                let aDate = ts.dateValue()
                let formatter = DateFormatter()
                formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
                let formattedTimeZoneStr = formatter.string(from: aDate)
                print(title, formattedTimeZoneStr)
            }
        }
    }
}

и вывод

stamp_0 2018-09-18 08:00:00 -0400
stamp_1 2018-09-18 08:01:00 -0400
stamp_2 2018-09-18 08:02:00 -0400

Вот так вы и получаете данные метки времени.

Хранить его в своем классе модели можно несколькими способами, в зависимости от того, что вы хотите с ним делать: его можно сохранить в виде отформатированной строки метки времени (как показано в моем ответе) или объекта метки времени Firestore или объект Date (NSDate). Просто зависит от вашего варианта использования.

Метка времени API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...