Я пытался создать домашнюю ленту, которая будет извлекать сообщения от пользователей, за которыми следит текущий пользователь.В настоящее время он работает наполовину.Он тянет посты от ваших подписчиков.
У меня есть 2 ошибки в коде, которые я не могу исправить:
Ошибка обновления
Когда пользователь по какой-то причине пытается обновитьотображается в виде постов дважды, вместо этого я намеревался показать только первые первые пять постов.
Ошибка разбиения на страницы
Я не совсем уверен, как я могу остановитьсообщения, загружаемые после того, как последнее сообщение было отображено, в настоящее время просто продолжают загружать последние 5 сообщений, вместо того, чтобы прекратить не загружать их.
Получение следующих сообщений:
fileprivate func fetchFollowingUserIds() {
guard let uid = Auth.auth().currentUser?.uid else { return }
Database.database().reference().child("user-following").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
guard let userIdsDictionary = snapshot.value as? [String: Any] else { return }
userIdsDictionary.forEach({ (key, value) in
Database.fetchUserWithUID(uid: key, completion: { (user) in
self.fetchPostsWithUser(user: user)
})
})
})
}
Функция нумерации страниц:
var startKey: String!
fileprivate func fetchPostsWithUser(user: User) {
guard let uid = Auth.auth().currentUser?.uid else { return }
let ref = Database.database().reference().child("posts").child(user.uid)
if startKey == nil {
ref.queryOrderedByKey().queryLimited(toFirst: 5).observe(DataEventType.value) { (snapshot) in
guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
allObjects.reverse()
allObjects.forEach({ (snapshot) in
guard let dictionary = snapshot.value as? [String: Any] else { return }
var post = Post(user: user, dictionary: dictionary)
let postId = snapshot.key
post.id = snapshot.key
self.startKey = postId
print(self.startKey)
self.posts.append(post)
self.posts.sort(by: { (post1, post2) -> Bool in
return post1.creationDate.compare(post2.creationDate) == .orderedDescending
})
self.collectionView?.reloadData()
})
}
} else {
print("Loading more posts")
guard let lastD = startKey else { return }
let queryRef = ref.queryOrdered(byChild: "creation_date")
let queryEndingRef = queryRef.queryEnding(atValue: lastD)
let queryLimitedRef = queryEndingRef.queryLimited(toLast: 5)
queryLimitedRef.observeSingleEvent(of: .value) { (snapshot) in
guard var postArray = snapshot.children.allObjects as? [DataSnapshot] else { return }
postArray.reverse()
postArray.removeFirst()
postArray.forEach({ (snapshot) in
print(snapshot.key)
guard let dictionary = snapshot.value as? [String: Any] else { return }
var post = Post(user: user, dictionary: dictionary)
let postId = snapshot.key
post.id = snapshot.key
self.posts.append(post)
self.posts.sort(by: { (post1, post2) -> Bool in
return post1.creationDate.compare(post2.creationDate) == .orderedDescending
})
DispatchQueue.main.async {
self.collectionView?.reloadData()
}
})
}
}
}
override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let currentOffset = scrollView.contentOffset.y
let maxOffset = scrollView.contentSize.height - scrollView.frame.size.height
if maxOffset - currentOffset <= 40{
fetchAllPosts()
}
}
Функция обновления
@objc func handleRefresh() {
print("Handling refresh..")
posts.removeAll()
fetchAllPosts()
DispatchQueue.main.async {
self.collectionView?.reloadData()
}
}
fileprivate func fetchAllPosts() {
fetchPosts()
fetchTrustingUserIds()
self.collectionView?.refreshControl?.endRefreshing()
}