Ошибка нумерации страниц коллекции с помощью Swift 4 и Firebase - PullRequest
0 голосов
/ 08 февраля 2019

Я пытался создать домашнюю ленту, которая будет извлекать сообщения от пользователей, за которыми следит текущий пользователь.В настоящее время он работает наполовину.Он тянет посты от ваших подписчиков.

У меня есть 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...