Быстрая разбиение на страницы Firestore извлекает следующую партию документов, но заменяет первую партию

# #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 вызов с последним загруженным до сих пор документом, чтобы избавиться от этого.