在TableView中加载搜索到的数据时如何停止Firestore分页 [英] How to stop Firestore pagination when searched data are loaded in tableView

查看:96
本文介绍了在TableView中加载搜索到的数据时如何停止Firestore分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用无限滚动在tableView中填充我的Firestore数据.此外,我还有一个searchBar用于搜索. 我成功地对数据进行了分页,但是当我搜索某些内容并用找到的数据重新加载tableView时,在滚动后,分页再次开始.无法禁用滚动,因为数据可能大于屏幕高度.

I use infinite scroll to populate my Firestore data in tableView.Also I have a searchBar for searching. i paginate my data successfully, but when I search something and reload the tableView with the data that have been found , the pagination starts again after I scroll. It's not possible to disable the scrolling because data may be more than the screen height.

下面我提供了我的代码.

Below I provide my code.

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")
                }
            }
        }

    }

提前谢谢!

推荐答案

解决方案

我终于找到了解决方案.在searchIngredients(text: String)函数中,我应该在开头和结尾处将fetchMoreIngredients声明为true.

I finally found the solution. In the searchIngredients(text: String) function I should have declared the fetchMoreIngredients as true in the beginning and within the closure.

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")
            }
        }
    }

}

这篇关于在TableView中加载搜索到的数据时如何停止Firestore分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆