Проблема в вашем вопросе заключается в том, что 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 не должна возвращать значение, равно как и
.