Как остановить пагинацию Firestore при загрузке искомых данных в tableView - PullRequest
0 голосов
/ 05 июня 2019

Я использую бесконечную прокрутку, чтобы заполнить мои данные Firestore в tableView. Также у меня есть searchBar для поиска.я успешно разбил свои данные на страницы, но когда я что-то ищу и перезагружаю tableView с найденными данными, нумерация страниц начинается снова после прокрутки.Невозможно отключить прокрутку, потому что данные могут быть больше, чем высота экрана.

Ниже я предоставляю свой код.

var fetchMoreIngredients = false
var reachEnd = false
let leadingScreensForBatching: CGFloat = 10.0
//When user scrolls down it begins to fetch more.
     func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let off = scrollView.contentOffset.y
        let off1 = scrollView.contentSize.height

        if off > off1 - scrollView.frame.height * leadingScreensForBatching{
            if !fetchMoreIngredients && !reachEnd{
                print(fetchMoreIngredients)
                beginBatchFetch()
            }
        }
    }
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        guard !searchText.isEmpty else {
            ingredientsArray.removeAll()
            beginBatchFetch()
            return
        }

    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        let text = searchBar.text!.lowercased()
            searchIngredients(text: text)
            self.searchBarIngredient.endEditing(true)
            print("\(searchIngredients(text: text))")

    }
func  beginBatchFetch() {

        let settings = FirestoreSettings()
        settings.isPersistenceEnabled = false

        fetchMoreIngredients = true
        let db = Firestore.firestore()
        db.settings = settings

        var query: Query!

        if ingredientsArray.isEmpty {
            SVProgressHUD.show()

            query = db.collection("Ingredients").limit(to: 4)
            print("First 4 ingredient loaded")
        } else {
            query = db.collection("Ingredients").start(afterDocument: lastDocument).limit(to: 4)
            print("Next 4 ingredient loaded")
        }

        query.getDocuments { (querySnapshot, err) in
            if let err = err {
                print("\(err.localizedDescription)")
                print("Test Error")
            } else if querySnapshot!.isEmpty {
                self.fetchMoreIngredients = false
                return
            } else {
                if (querySnapshot!.isEmpty == false){
                    let res = querySnapshot!.documents.compactMap({Ingredients(dictionary: $0.data())})
                    self.ingredientsArray.append(contentsOf: res)

                    self.tableView.reloadData()
                    self.fetchMoreIngredients = false
                    SVProgressHUD.dismiss()
                }

                self.lastDocument = querySnapshot!.documents.last
            }
        }
    }
    func searchIngredients(text: String){

        fetchMoreIngredients = false

        let db = Firestore.firestore()

        db.collection("Ingredients").whereField("compName", arrayContains: text).getDocuments{ (querySnapshot, err) in
            if let err = err {
                print("\(err.localizedDescription)")
                print("Test Error")
            } else {
                if (querySnapshot!.isEmpty == false){
                    self.searchedIngredientsArray = querySnapshot!.documents.compactMap({Ingredients(dictionary: $0.data())})
                    self.ingredientsArray = self.searchedIngredientsArray
                    self.tableView.reloadData()


                }else{
                    print("No Ingredients were found")
                }
            }
        }

    }

Заранее спасибо!

1 Ответ

0 голосов
/ 05 июня 2019

РЕШЕНИЕ

Я наконец нашел решение. В функции searchIngredients(text: String) я должен был объявить fetchMoreIngredients как истину в начале и в закрытии.

func searchIngredients(text: String){

    fetchMoreIngredients = true

    let db = Firestore.firestore()

    db.collection("Ingredients").whereField("compName", arrayContains: text).getDocuments{ (querySnapshot, err) in
        if let err = err {
            print("\(err.localizedDescription)")
            print("Test Error")
        } else {
            if (querySnapshot!.isEmpty == false){
                self.searchedIngredientsArray = querySnapshot!.documents.compactMap({Ingredients(dictionary: $0.data())})
                self.ingredientsArray = self.searchedIngredientsArray
                self.tableView.reloadData()
                self.fetchMoreIngredients = true


            }else{
                print("No Ingredients were found")
            }
        }
    }

}
...