swift - 使用 firebase 和 swift 将帖子分页到 Collection View

标签 swift firebase firebase-realtime-database

我正在尝试将用户关注的帖子从我的 firebase 数据库分页到我的收藏 View 。目前只有 4 个帖子被附加到 Collection View ,当我向下滚动时不再加载。

我试过更改最初加载的帖子数量,但没有成功。

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)
            })
        })

    }) { (err) in
        print("Failed to fetch following user ids:", err)
    }
}

var posts = [Post]()
fileprivate func fetchPosts() {
    guard let uid = Auth.auth().currentUser?.uid else { return }

    Database.fetchUserWithUID(uid: uid) { (user) in
        self.fetchPostsWithUser(user: user)
    }
}

var isFinishedPaging = false
fileprivate func fetchPostsWithUser(user: User) {

    self.collectionView?.refreshControl?.endRefreshing()

    let ref = Database.database().reference().child("posts").child(user.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: 4).observeSingleEvent(of: .value, with: { (snapshot) in

        guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

        allObjects.reverse()

        if allObjects.count < 4 {
            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)
    }
}

我只是想让它在用户向下滚动时加载更多帖子。

最佳答案

可能存在查询问题或潜在的逻辑问题。假设您要向用户展示帖子,最新的帖子位于列表顶部,并允许用户向下滚动以查看较早的帖子。

让我们用一个例子来解决这两个问题:

我们没有您的结构,但保持 super 简单,假设您的帖子具有以下结构和创建日期

post_0
   creation_date: "20180101"
post_1
   creation_date: "20180102"
post_2
   creation_date: "20180103"
post_3
   creation_date: "20180104"
post_4
   creation_date: "20180105"
post_5
   creation_date: "20180106"
post_6
   creation_date: "20180107"
post_7
   creation_date: "20180108"

这是您的初始查询,按创建日期排序,它将加载从 5 日到 8 日的最后 4 个帖子

var query = ref.queryOrdered(byChild: "creationDate")

然后后续查询按创建日期排序,但结束值不是创建日期而是自创建日期的 1970 年以来耗时

let value = posts.last?.creationDate.timeIntervalSince1970
var query = ref.queryOrdered(byChild: "creationDate").queryEnding(atValue: value)

我猜你只想加载接下来的 4 个较早的帖子。因此,当它位于数组中时,它们看起来像这样:

20180108
20180107
20180106
20180105

一种方法是从您的数据源中获取最后一篇文章的创建日期(这将是最旧的文章)

20180105

然后按creationDate查询,ending在最后一个帖子的创建日期,得到总共5个帖子,然后去掉最后一个

20180101
20180102
20180103
20180104
20180105

然后反转

20180105
20180104
20180103
20180102
20180101

并删除第一个

20180104
20180103
20180102
20180101

像这样

let lastD = self.postsArray.last
self.postsArray = []

let postsRef = self.ref.child("posts")
let queryRef = postsRef.queryOrdered(byChild: "creation_date")
let queryEndingRef = queryRef.queryEnding(atValue: lastD)
let queryLimitedRef = queryEndingRef.queryLimited(toLast: 5)
queryLimitedRef.observeSingleEvent(of: .value, with: { snapshot in
    guard var thisArray = snapshot.children.allObjects as? [DataSnapshot] else { return }

    thisArray.reverse()
    thisArray.removeFirst()

    for post in thisArray {
        let theDate = post.childSnapshot(forPath: "creation_date").value as! String
        self.postsArray.append(theDate)
    }
})

关于swift - 使用 firebase 和 swift 将帖子分页到 Collection View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53976034/

相关文章:

javascript - 将数据添加到数据库时,Firebase 函数不会触发

android - 如何使用 firebase 云功能在特定日期删除 firebase DB 数据

ios - Swift 的编码/解码枚举 (Xcode 6.1)

arrays - 在 Swift 中读取 JSON 中的嵌套数组和元组

ios - 在 iOS 中同时插入 CoreData

android - 当我们在 Firebase 中调用 push() 生成 key 时,位置是否重要?

javascript - 如何获取 Angular 函数之外的变量值

ios - 为什么我不能在 UIImage 上绘图?

android - 两个用户使用 Firebase 进行数据交换

swift - 火存储 : query with array comparison