Ошибка при попытке сделать другой запрос в Firestore - PullRequest
0 голосов
/ 17 июня 2019

У меня есть 2 кнопки.

  • Когда я нажимаю кнопку поиска, приложение переходит в просмотр таблицы с моим данные о пожарном депо и панель поиска.
  • Когда я нажимаю кнопку «Запрос», я запрашиваю свою базу данных на основе массива.

Проблема в том, что когда я нажимаю кнопку «Запрос» и мой запрос завершается, если я возвращаюсь и нажимаю кнопку поиска, мое приложение вылетает со следующей ошибкой.

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'FIRESTORE INTERNAL ASSERTION FAILED: Firestore instance has already been started and its settings can no longer be changed. You can only set settings before calling any other methods on a Firestore instance.'
*** First throw call stack:
(0x1d95ed27c 0x1d87c79f8 0x1d9506988 0x1da016ee8 0x1050f2f7c 0x104f0aaa4 0x104f1be30 0x104e0cba4 0x104e0a6a8 0x104e0ab78 0x205949fc8 0x20594a3cc 0x2058a74c8 0x2058bb4b8 0x2058bc8e0 0x20589faf0 0x20638aed0 0x1ddaa1a20 0x1ddaa69c8 0x1dda092d0 0x1dda37330 0x1dda37f20 0x1d957e5f8 0x1d9579320 0x1d957989c 0x1d95790b0 0x1db77979c 0x205ef3978 0x104e22e58 0x1d903e8e0)
libc++abi.dylib: terminating with uncaught exception of type NSException

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

EDIT

Некоторый код из моей кнопки поиска, который я использую пакетами.

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

    }

1 Ответ

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

Вы включаете локальный кеш для Firestore с этим кодом:

let settings = FirestoreSettings()
settings.isPersistenceEnabled = false

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

Это должно быть сделано только один раз для всего запуска приложения, в то время как вы, кажется, делаете это несколько раз.

Обычное решение - переместить этот код в ваш AppDelegate, чтобы он соответствовал жизненному циклу вашего приложения.Но поскольку локальное сохранение по умолчанию включено для Firestore на iOS, вы также можете просто удалить этот код и получить то же поведение.

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