# #swift #uitableview #google-cloud-firestore #pagination
Вопрос:
В 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()
}
}
Ответ №1:
Я думаю, что проблема кроется в звонке 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
, вместо того, чтобы каждый раз заменять его.
Комментарии:
1. Спасибо вам за ваш комментарий, Фрэнк. Во время второго вызова self.glimpse.removeAll() не должно быть проблемой, в этот момент currentkey не равен нулю, и был вызван блок «еще».
2. Ой… Я мысленно изменил условия. Блок else также заменяет существующее значение
self.glimpse
с каждым снимком, хотя:self.glimpse = Glimpse.parseData(snapshot: snapshot)
. Я ожидал бы увидеть что-то, в чем вы добавляетеGlimpse.parseData(snapshot: snapshot)
self.glimpse
, вместо того, чтобы каждый раз заменять его.3. понял, имеет смысл, я должен добавить новые документы к себе.взгляните. Единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что он загружает следующую партию документов, но, когда я достигаю дна, он загружает одни и те же последние 3 снова и снова.
4. Да, возможно, вы захотите добавить
startAfter
вызов с последним загруженным до сих пор документом, чтобы избавиться от этого.