当前,我最初是通过以下方式加载用户的消息:
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仍保持不变?基本上,当我刷新表视图时,它并没有查询正确的数据,并且我的分页实现似乎无法正常工作。
答案 0 :(得分:0)
基本上,问题是我将帖子插入数组中的错误位置,并且最后一项仍被添加到数组中,这始终是相同的(因为我以值结尾)。这样,我添加了一个计数器,该计数器在每次添加值时都会增加。然后,我将后续的帖子插入数组中的计数器值,然后再次递增。最后,如果消息ID等于数组中当前的第一条消息,我将不会插入它。