Swift Firestore 分页正在检索下一批文档但正在替换第一批
Swift Firestore pagination is retrieving the next batch of documents but replacing the first batch
在 Swift 中,我正在尝试实现分页并且我能够检索下一批文档,但是,它不是将它们加载到 UITableView 的底部,而是替换了第一批。我不确定我做错了什么。任何帮助是极大的赞赏。这是我的代码:
private var currentKey: String?
func fetchGlimpseData() {
if currentKey == nil {
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3)
.getDocuments { (snapshot, error) in
guard let last = snapshot?.documents.last else { return }
guard let allObjects = snapshot?.documents else { return }
allObjects.forEach( { document in
self.glimpse.removeAll()
self.glimpse = Glimpse.parseData(snapshot: snapshot)
self.glimpseTableView.reloadData()
})
self.currentKey = last.documentID
}
} else if currentKey != nil {
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3).getDocuments { (snapshot, error) in
guard let lastDoc = snapshot?.documents.last else { return }
if snapshot?.isEmpty == false {
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).start(afterDocument: lastDoc).getDocuments { ( snapshot, error) in
guard let snap = snapshot?.documents else { return }
snap.forEach( { document in
self.glimpse = Glimpse.parseData(snapshot: snapshot)
})
}
}
self.glimpseTableView.reloadData()
}
}
}
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 {
fetchGlimpseData()
}
}
我认为问题出在此处对 self.glimpse.removeAll()
的调用:
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3)
.getDocuments { (snapshot, error) in
guard let last = snapshot?.documents.last else { return }
guard let allObjects = snapshot?.documents else { return }
allObjects.forEach( { document in
self.glimpse.removeAll()
self.glimpse = Glimpse.parseData(snapshot: snapshot)
...
由于您首先从 self.glimpse
中删除了所有数据,因此在您添加新数据后会删除上一页数据。
要保留两个页面,请不要调用 self.glimpse.removeAll()
。
正如您在评论中指出的那样,您的第二页是由 else 块加载的 - 因此上述内容不会导致该问题。
在 else 块中,您还用以下行中的每个快照替换 self.glimpse
的现有值:
self.glimpse = Glimpse.parseData(snapshot: snapshot)
所以:无论 self.glimpse
在该行之前有什么值,它都会在该行有 运行.
之后消失
我希望看到您 将 Glimpse.parseData(snapshot: snapshot)
添加到 self.glimpse
而不是每次都替换它的地方。
在 Swift 中,我正在尝试实现分页并且我能够检索下一批文档,但是,它不是将它们加载到 UITableView 的底部,而是替换了第一批。我不确定我做错了什么。任何帮助是极大的赞赏。这是我的代码:
private var currentKey: String?
func fetchGlimpseData() {
if currentKey == nil {
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3)
.getDocuments { (snapshot, error) in
guard let last = snapshot?.documents.last else { return }
guard let allObjects = snapshot?.documents else { return }
allObjects.forEach( { document in
self.glimpse.removeAll()
self.glimpse = Glimpse.parseData(snapshot: snapshot)
self.glimpseTableView.reloadData()
})
self.currentKey = last.documentID
}
} else if currentKey != nil {
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3).getDocuments { (snapshot, error) in
guard let lastDoc = snapshot?.documents.last else { return }
if snapshot?.isEmpty == false {
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).start(afterDocument: lastDoc).getDocuments { ( snapshot, error) in
guard let snap = snapshot?.documents else { return }
snap.forEach( { document in
self.glimpse = Glimpse.parseData(snapshot: snapshot)
})
}
}
self.glimpseTableView.reloadData()
}
}
}
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 {
fetchGlimpseData()
}
}
我认为问题出在此处对 self.glimpse.removeAll()
的调用:
GLIMPSE_ALL_USERS_DATA.order(by: TIMESTAMP, descending: true).limit(to: 3)
.getDocuments { (snapshot, error) in
guard let last = snapshot?.documents.last else { return }
guard let allObjects = snapshot?.documents else { return }
allObjects.forEach( { document in
self.glimpse.removeAll()
self.glimpse = Glimpse.parseData(snapshot: snapshot)
...
由于您首先从 self.glimpse
中删除了所有数据,因此在您添加新数据后会删除上一页数据。
要保留两个页面,请不要调用 self.glimpse.removeAll()
。
正如您在评论中指出的那样,您的第二页是由 else 块加载的 - 因此上述内容不会导致该问题。
在 else 块中,您还用以下行中的每个快照替换 self.glimpse
的现有值:
self.glimpse = Glimpse.parseData(snapshot: snapshot)
所以:无论 self.glimpse
在该行之前有什么值,它都会在该行有 运行.
我希望看到您 将 Glimpse.parseData(snapshot: snapshot)
添加到 self.glimpse
而不是每次都替换它的地方。