Попытка отсортировать массив снимков по createdAt. Сложность, поскольку Google изменил формат даты на TimeStamp

Я попытался преобразовать метку времени в дату, используя Timestamp.dateValue()

Я использовал это, которое работало, когда они использовали Date

 self.tableData = self.tableData.sorted(by: { 
 $0["createdAt"] as! Date > $1["createdAt"] as! Date })

Я пытался использовать это с Timestamp, так как вы не можете сортировать непосредственно по Timestamp - я не могу заставить его работать или иметь правильный синтаксис...

   self.tableData =  self.tableData.sorted(by: {
       $0["createdAt"] as Timestamp.dateValue() as! Date >
       $1["createdAt"] as Timestamp.dateValue() as! Date })

Любая помощь будет оценена по достоинству. Есть идеи, почему Google изменился с даты на метку времени? Это усложняет сортировку. Я знаю, что вы можете сортировать во время запроса, но мне нужно сортировать по запросу базы данных.

0
Robert Marlan 12 Ноя 2019 в 06:22
Помогает ли вам метод сравнения Timestamp? firebase.google.com/docs/reference/ swift/firebasefirestore/api/…:
 – 
Doug Stevenson
12 Ноя 2019 в 06:27
Ссылка на createdAt немного расплывчата без понимания того, что конкретно вы храните в этом поле. Кроме того, можете ли вы включить код того, как этот документ/поле читается и сохраняется в вашем массиве?
 – 
Jay
12 Ноя 2019 в 22:37
Причина? NSDate реализован как двойник, который теряет точность и вызывает неожиданное поведение при использовании метки времени из моментального снимка как части последующего запроса. См. также areTimestampsInSnapshotsEnabled, поскольку его можно отключить. чтобы восстановить предыдущее поведение, отметив, что вы должны перейти на новый формат Timestamp.
 – 
Jay
12 Ноя 2019 в 22:44

1 ответ

Я сделал это, как показано ниже: -

  • При отображении данных сопоставьте их как переменную типа даты: -

    let createdAt : Date? = snapshotValue["createdAt"] as? Date  
    
  • И затем я сортирую массив, как показано ниже: -

    let currentArr = commentsArray.sorted(by: {
            $0.createdAt!.compare($1.createdAt!) == .orderedDescending
        })
    

ИЛИ

Вы можете получить отсортированные данные напрямую, как показано ниже:

    Firestore.firestore().collection(“samples”).order(by: "createdAt", descending: true).whereField(“sampleId”, isEqualTo: sampleId).addSnapshotListener({ (querySnapSHot, error) in })
1
Nexus 12 Ноя 2019 в 08:16
Раньше это работало, но в настоящее время Google использует метку времени вместо даты для createdAt.
 – 
Robert Marlan
12 Ноя 2019 в 07:19
Вы можете сохранить значение как метку времени в firebase. Это код после получения значения метки времени.
 – 
Nexus
12 Ноя 2019 в 07:22
Понятно. Я надеялся, что мне не придется изменять мою базу данных и сортировать непосредственно по значениям метки времени, как указано в снимке.
 – 
Robert Marlan
12 Ноя 2019 в 07:35
Да, вам не нужно менять свою базу данных, если вы не сохраните значение «createdAt» как TimeStamp.
 – 
Nexus
12 Ноя 2019 в 07:39
Google меняет это. Firestore перемещается на метки времени в функциях Firebase. Ссылка: codeday.me/en/qa/20190305/1949.html
 – 
Robert Marlan
12 Ноя 2019 в 08:00