Firebase分页数据返回相同的数据?

时间:2018-07-05 07:00:48

标签: swift firebase pagination tableview

当前,我最初是通过以下方式加载用户的消息:

  func fetchMessages() {

    if started == true {

    let messageRef = Database.database().reference().child("messages").queryOrdered(byChild: "convoID").queryEqual(toValue: convoID).queryLimited(toLast: 10)
    messageRef.observe(.childAdded) { (snapshot) in
        if let value = snapshot.value as? NSDictionary {
            let newMessage = message()
            newMessage.messageText =  value["content"] as? String
            newMessage.sender = value["sender"] as? String
            newMessage.messageID = snapshot.key
            self.messageList.append(newMessage)


            self.queryingStatus = true
            self.messagesTableView.reloadData()
            self.scrollToBottom()
        }

    }
}
}

现在,为了最大程度地减少数据下载,我决定将消息分成多个块,以便用户每次上表视图时将下载十条后续消息:

   @objc func handleRefresh(_ refreshControl: UIRefreshControl) {

    let lastIDDictionary = messageList[0]
    let lastIDQueried = lastIDDictionary.messageID

    let messageRefAddition = Database.database().reference().child("messages").queryOrdered(byChild: "convoID").queryLimited(toLast: 10).queryEnding(atValue: convoID, childKey: lastIDQueried!)
    messageRefAddition.observeSingleEvent(of: .value) { (snapshot) in

        for child in snapshot.children.allObjects as! [DataSnapshot] {

            if let messageValue = child.value as? NSDictionary {

            let newMessage = message()
            newMessage.messageText =  messageValue["content"] as? String
            newMessage.sender = messageValue["sender"] as? String
            newMessage.messageID = child.key

            self.messageList.insert(newMessage, at: 0)
            self.messagesTableView.reloadData()
            }
        }

    }


    refreshControl.endRefreshing()
}

问题是,当我上拉表视图时,它第一次返回一些新消息(我不确定顺序是否正确)。但是,当我再次拉动表视图进行刷新时,它会再次添加相同的十条消息。我在刷新方法中打印了lastIDQueried,并且在初始加载后,即使我正在访问词典数组中的第一项,ID仍保持不变?基本上,当我刷新表视图时,它并没有查询正确的数据,并且我的分页实现似乎无法正常工作。

1 个答案:

答案 0 :(得分:0)

基本上,问题是我将帖子插入数组中的错误位置,并且最后一项仍被添加到数组中,这始终是相同的(因为我以值结尾)。这样,我添加了一个计数器,该计数器在每次添加值时都会增加。然后,我将后续的帖子插入数组中的计数器值,然后再次递增。最后,如果消息ID等于数组中当前的第一条消息,我将不会插入它。