Я работаю над приложением для iOS, которое имеет функции, аналогичные Instagram. Я успешно выполнил разбиение на страницы на странице своего профиля, но постоянно не получал нужного результата в своей домашней ленте.
Цель - извлекать сообщения в хронологическом порядке по дате. Последний должен прийти первым. Сообщения от людей, за которыми я следую. Извлечение 3 сначала, а затем еще 3 при прокрутке вниз.
Пример структуры базы данных реального времени Firebase.
Таблица пользователей
users
-uid
-name
-emailID
стол сообщений
posts
-uid
-pid
-title
-date
-pid2
-title
-date
Controller.swift
Я получаю все идентификаторы пользователя
а потом я пытаюсь получить сообщения из этих UID
fileprivate func fetchPosts() {
guard let uid = Auth.auth().currentUser?.uid else { return }
Database.fetchUserWithUID(uid: uid) { (user) in
self.fetchPostsWithUser(user: user)
}
}
fileprivate func fetchPostsWithUser(user: User) {
let uid = user.uid
let ref = Database.database().reference().child("posts").child(uid)
var query = ref.queryOrdered(byChild: "creationDate")
if posts.count > 0 {
let value = posts.last?.creationDate.timeIntervalSince1970
query = query.queryEnding(atValue: value)
}
query.queryLimited(toLast: 3).observeSingleEvent(of: .value, with: { (snapshot) in
guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.reverse()
print("coint is , ", allObjects.count)
if allObjects.count < 2 {
self.isFinishedPaging = true
} else {
self.isFinishedPaging = false
}
if self.posts.count > 0 && allObjects.count > 0 {
allObjects.removeFirst()
}
allObjects.forEach({ (snapshot) in
guard let dictionary = snapshot.value as? [String: Any] else { return }
var post = Post(user: user, dictionary: dictionary)
post.id = snapshot.key
self.posts.append(post)
})
self.collectionView?.reloadData()
}) { (err) in
print(err)
}
}
расширение
extension Database {
static func fetchUserWithUID(uid: String, completion: @escaping (User) -> ()) {
Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
guard let userDictionary = snapshot.value as? [String: Any] else { return }
let user = User(uid: uid, dictionary: userDictionary)
completion(user)
}) { (err) in
print("Failed to fetch user for posts:", err)
}
}
Этот код работает, но странно. Я не получаю сообщения в правильном порядке. Это всегда дает мне вывод случайно заказанных постов.
Что мне делать?