Проблема SearchBar при попытке поиска в Firestore и перезагрузке таблицы - PullRequest
0 голосов
/ 04 июня 2019

У меня есть tableView, и я использую бесконечную прокрутку, чтобы заполнить данные пожарного депо пакетами.Также у меня есть панель поиска, и я пытаюсь запросить в firestore текст из текстовой панели, а затем заполнить его в виде таблицы.У меня есть 3 основные проблемы.

  1. Когда я нажимаю кнопку поиска в тебе первый раз, я получаю пустой массив и пустое представление таблицы, но когда я нажимаю кнопку поиска во второй раз, все выглядит нормально.

  2. Когда я наконец заполняю искомый контент, я хочу прекратить извлекать новый контент во время прокрутки.

  3. Если я напишу не то слово и нажму поиск, тоЯ получаю предыдущий поиск, а затем «Компоненты не найдены» напечатаны дважды.

Это мой код для searchBar:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        guard let text = searchBar.text else {return}
        searchIngredients(text: text)
        self.searchBarIngredient.endEditing(true)
        print("\(searchIngredients(text: text))")
    }

Код функции, когда янажмите кнопку поиска

func searchIngredients(text: String) -> Array<Any>{

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

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

         self.tableView.reloadData()
         ingredientsArray = searchedIngredientsArray

        return ingredientsArray

    }

Наконец код для прокрутки

func scrollViewDidScroll(_ scrollView: UIScrollView) {

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

        if off > off1 - scrollView.frame.height * leadingScreensForBatching{
            if !fetchMoreIngredients && !reachEnd{
                beginBatchFetch()
            }
        }
    }

Я не пишу beginBatchFetch (), потому что он работает нормально, и я не думаю, что это уместно.Заранее спасибо.

1 Ответ

1 голос
/ 04 июня 2019

Проблема в вашем вопросе заключается в том, что Firestore асинхронный .

Для Firestore требуется время, чтобы вернуть запрошенные вами документы, и эти данные будут действительны только в закрытии, вызывающем функцию. Код за пределами замыкания будет выполняться до того, как данные будут доступны внутри замыкания.

Итак, вот что происходит.

func searchIngredients(text: String) -> Array<Any>{
    let db = Firestore.firestore()
    db.collection("Ingredients").whereField("compName", arrayContains: text).getDocuments{ (querySnapshot, err) in
        //the data has returned from firebase and is valid
    }
    //the code below here will execute *before* the code in the above closure
    self.tableView.reloadData()
    ingredientsArray = searchedIngredientsArray
    return ingredientsArray
}

происходит обновление таблицы до того, как в массиве появятся какие-либо данные.

Вы также возвращаете ArrayArray до того, как он будет заполнен. Что еще более важно, попытки вернуть значение из асинхронной функции можно (и нужно) вообще избежать.

Исправление заключается в обработке данных в закрытии

class ViewController: NSViewController {
   var ingredientArray = [String]()
   func searchIngredients(text: String) {
         let db = Firestore.firestore()
         db.collection("Ingredients").whereField("compName", arrayContains: text).getDocuments{ (querySnapshot, err) in
             //the data has returned from firebase and is valid
             //populate the class var array with data from firebase
             //    self.ingredientArray.append(some string)
             //refresh the tableview
         }
     }

Обратите внимание, что функция searchIngredients не должна возвращать значение, равно как и

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...