SwiftUI Firestore не справляется с нумерацией курсоров - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь реализовать нумерацию страниц в своем приложении. когда приложение загружается, я хочу загрузить первый элемент, скажем. затем каждый раз, когда он нажимает refre sh, загружается новый элемент. Я реализовал эту логику c в моей модели представления.

Первый раз homeViewModel.load() вызывается в моем SceneDelegate

let homeViewModel = HomeViewModel()
homeViewModel.refresh()

Затем каждый раз, когда пользователи хотят получить новые даты, я звоню homeViewModel.refresh()

Проблема в том, что при загрузке приложения я не получаю никаких результатов, а когда нажимаю refre sh Я снова и снова получаю второй документ в таблице.

Что я здесь не так делаю?

Моя модель HomeView:

class HomeViewModel: ObservableObject, LoadProtocol {
    var firestoreService: FirestoreService = FirestoreService()
    @Published var items: [Item] = []
    let db = Firestore.firestore()
    var first: Query = Firestore.firestore().collection("items").limit(to: 1)

    load() {
        self.first.addSnapshotListener { (snapshot, error) in

            guard let snapshot = snapshot else {
                print("Error retreving cities: \(error.debugDescription)")
                return
            }

            guard let lastSnapshot = snapshot.documents.last else {
                // The collection is empty.
                return
            }

            // Construct a new query starting after this document,
            // retrieving the next 25 cities.
            let next = self.db.collection("items")
                .start(afterDocument: lastSnapshot).limit(to: 1)

            self.first = next

            // Use the query for pagination.
        }


    }

    func refresh() {
        self.firestoreService.fetchCollection(query: self.first) { (result: Result<[Item], Error>) in
            switch result {
            case .success(let items):
                self.items += items
                self.addToCategories()
            case .failure(let error):
                print(error)
            }
        }
    }
}

1 Ответ

2 голосов
/ 01 мая 2020

Вот ваша функция refre sh

func refresh() {
    self.firestoreService.fetchCollection(query: self.first) { (result: Result<[Item], Error>) in
        switch result {
        case .success(let items):
            self.items += items
            self.addToCategories()
        case .failure(let error):
            print(error)
        }
    }
}

В этой функции нет ничего, что продвигает курсор дальше, поэтому он будет считывать одни и те же данные снова и снова.

Если вы хотите После прочтения следующего набора данных, курсор необходимо перемещать в последний документ после каждого refre sh, например,

func refresh() {
    self.first.addSnapshotListener { (snapshot, error) in
        if let err = error {
            print(err.localizedDescription)
            return
        }

        guard let snapshot = snapshot else { return }

        guard let lastSnapshot = snapshot.documents.last else { return }

        let next = self.db.collection("items").start(afterDocument: lastSnapshot).limit(to: 2)

        self.first = next

        for doc in snapshot.documents {
            print(doc.documentID)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...