如何使用Swift和Firebase进行分页?

时间:2018-06-26 20:17:15

标签: swift firebase pagination swift4.1

我正在开发一个功能类似于Instagram的iOS应用。我已经在个人资料页面上成功完成了分页,但是始终无法在家庭供稿中获得正确的结果。

目标-按日期的时间顺序获取帖子。最新的应该优先。帖子来自我关注的人。首先获取3,然后向下滚动则获取另外3。

示例Firebase实时数据库结构。

用户表

users
 -uid
  -name
  -emailID

帖子表

posts
 -uid
   -pid
    -title
    -date
   -pid2
    -title
    -date

Controller.swift

我得到了特定用户的所有uid 然后我尝试从这些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)
        }
    }

此代码有效,但很奇怪。我没有按正确的顺序安排这些职位。它总是给我输出随机排序的帖子。

我该怎么办?

3 个答案:

答案 0 :(得分:0)

您以随机顺序获取帖子的原因是因为observeSingleEvent(of: )从数据库中获取数据是先到先得的基础。因此,在Firebase UI中,它可能是基于创建的字母顺序,但这并不意味着它在获取时将显示在视图中。您必须使用queryOrderedByKey或(queryOrderedByValue)并按键/值对其进行排序(如果您按childByAutoID创建帖子,则会自动从最早的(顶部)到创建时最新。

答案 1 :(得分:0)

在self.posts.append和reloadData之间添加以下行将解决您的问题。

tf.saved_model.simple_save(
    keras.backend.get_session(),
    './simple_save/',
    inputs={t.name.split(':')[0]:t for t in model.input},
    outputs={t.name.split(':')[0]:t for t in model.outputs},
    legacy_init_op=tf.tables_initializer())

答案 2 :(得分:0)

1)。从firebase提取前5个数据,这里我的表名是“ Tweets”

    let FetchtweetRef = FIRDatabase.database().reference()
    FetchtweetRef.child("Tweets").queryOrderedByKey().queryLimited(toLast: 5).observe(FIRDataEventType.value, with: { (tweets) in

        for  tweet in tweets.children{
            let newTweet = Tweet(snaspshot: tweet as! FIRDataSnapshot)
            // Store object in Array
        }

        FetchtweetRef.child("Tweets").removeAllObservers()
    })

2)。在“获取下5个数据”在您的表视图上滚动之后。

    // Here find last object key from array.
    let key = self.tweetArray[self.tweetArray.count].key

    let FetchtweetRef = FIRDatabase.database().reference()
    FetchtweetRef.child("Tweets").queryOrderedByKey().queryEnding(atValue: key).queryLimited(toLast: 6).observe(.value, with: {(tweets) in

        for  tweet in tweets.children {
            let newTweet = Tweet(snaspshot: tweet as! FIRDataSnapshot)
           // Stored object in Array
        }
        FetchtweetRef.child("Tweets").removeAllObservers()
    })