Обещаю ЛЕГКОЕ прочтение :)

Привет, я сейчас застрял. Я хотел бы запросить все сообщения, начиная с самого нового сообщения вместо самого старого. Почему? Потому что это единственный способ включить разбиение на страницы в свой tableView. (что означает перезагрузку, когда пользователь доходит до дна)

Допустим, у меня есть 10 сообщений, начиная с самого старого №1 и самого нового №10: 1,2, ..., 10 Если я запрашиваю только первые 5 сообщений, я получаю [1,2,3,4,5] , тогда я переворачиваю массив, который показывает [5,4,3,2, 1] в моем представлении таблицы, начиная с 5.

ПРОБЛЕМА . Проблема в том, что, когда пользователь доходит до нижней части представления таблицы, если я запрашиваю следующие пять сообщений, начиная с отметки времени последнего сообщения, я получаю ... [6, 7,8,9,10]

Но теперь мое представление таблицы больше не является правильным, поскольку оно показывает [5,4,3,2,1,10,9,8,7,6] Я надеюсь, что если я смогу использовать текущую дату устройства в качестве метки времени и запросить все сообщения до того, как показано ниже: я могу получить [10,9,8,7,6] , тогда когда пользователь достигает дна: [10,9,8,7,6,5,4,3,2,1]

Пусть todayTime: TimeInterval = NSDate (). timeIntervalSince1970

          FIRDatabase.database().reference().child("post").child(animal).queryOrderedByValue().queryEnding(atValue: todayTime, childKey: "datePost").queryLimited(toLast: 5).observe(.value, with: {(snapshot) in
0
24hrcoder 19 Июн 2017 в 03:21
Просто запишите свои временные метки как отрицательные значения, и все остальное станет на свои места. Я написал ответ на другой вопрос, который может помочь Отрицательно Отметка времени Firebase
 – 
Jay
19 Июн 2017 в 21:40
Прежде всего, спасибо за ответ !! Но хехе, ваш ответ очень сложный - я не могу сделать отметки времени отрицательными, поскольку они сделаны на базе firebase? Вы подразумеваете, что из своего ответа на предыдущий пост я запрашиваю временную метку, созданную в firebase, а затем делаю ее отрицательной? извините, я не носитель английского языка
 – 
24hrcoder
19 Июн 2017 в 23:09
Как указано в другом ответе, вы не можете напрямую получить метку времени из Firebase (в коде), но когда она написана (в соответствии с предоставленным кодом в моем ответе), вы можете наблюдать за записанным узлом, который предоставит вам метку времени в снимок. Затем вы можете сделать его отрицательным (в коде) и записать его в свои узлы, которые нужно упорядочить. С отрицательной меткой времени порядок будет через этот узел метки времени и, естественно, будет в правильной последовательности, причем самый новый будет «вверху». Таким образом, порядок будет -10 (самый новый), -9, -8 ....- 1. Итак, вы читаете от -10 до -5, затем от -4 до -1 и т. Д.
 – 
Jay
20 Июн 2017 в 00:27
Эй, Джей, извини за беспокойство, но у меня проблемы с этой частью, как ты сказал в своем комментарии [Таким образом, порядок будет -10 (самый новый), -9, -8 ....- 1. Итак, вы читаете от -10 до -5, затем от -4 до -1 и т. Д.] stackoverflow.com/questions/44682240/…
 – 
24hrcoder
21 Июн 2017 в 21:46

1 ответ

Лучший ответ

Учитывая следующую структуру

messages
  msg_0
    msg: "oldest message"
    timestamp: -1
  msg_1
    msg: "hello"
    timestamp: -4
  msg_2
    msg: "hello"
    timestamp: -2
  msg_3
    msg: "newest message"
    timestamp: -5
  msg_4
    msg: "hello"
    timestamp: -3

И следующий код

let messagesRef = self.ref.child("messages")
let queryRef = messagesRef.queryOrdered(byChild: "timestamp")
queryRef.observe(.childAdded, with: { snapshot in
    let key = snapshot.key
    print(key)
})

Вывод будет

msg_3 <-newest message
msg_1
msg_4
msg_2
msg_0 <-oldest message

Как видите, msg_3 - это самое новое сообщение, которое отображается «вверху», то есть это первый снимок, который получает запрос. Если вы заполняете массив, который будет использоваться в качестве источника данных, он будет добавлен с индексом 0, затем msg_1 будет с индексом 1 и т. Д.

Если пользователь прокручивает страницу и вы хотите загрузить следующие 5, это будут временные метки с 6 по 10, причем 10 будет самой новой.

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

let queryRef = messagesRef.queryOrdered(byChild: "timestamp")
                          .queryStarting(atValue: -3, childKey: "timestamp")
                          .queryEnding(atValue: -1, childKey: "timestamp")

Результат

msg_2
msg_0

Затем мы хотим загрузить следующие два самых старых

let queryRef = messagesRef.queryOrdered(byChild: "timestamp")
                          .queryStarting(atValue: -5, childKey: "timestamp")
                          .queryEnding(atValue: -3, childKey: "timestamp")

Что дает нам

msg_1
msg_4

Очевидно, я заменяю -5, -4 и т. Д. На фактическую временную метку, но это будет работать так же.

1
Jay 22 Июн 2017 в 00:43
Эй, Джей, дело в том, что я не знаю, какое конечное значение это хе-хе-хе ... Я пробовал использовать текущее время и даже просто 1 безуспешно? Последний последний совет
 – 
24hrcoder
22 Июн 2017 в 01:15
Если ответ помог, примите его, чтобы он помог другим!
 – 
Jay
22 Июн 2017 в 04:52
Да, извините, я пробовал поставить лайк несколько раз, но там написано: «голоса, отданные теми, у кого меньше 15 представителей. Записываются, но не меняют общедоступную оценку публикации»
 – 
24hrcoder
22 Июн 2017 в 05:01