SwiftUi: индекс вне диапазона для массива, выпущенного из Firestore - PullRequest
0 голосов
/ 26 апреля 2020

Я здесь новичок и изучаю, как кодировать с SwiftUi

Я пытаюсь выяснить, почему я не могу получить доступ к значениям моего массива, выпущенным из Firestore. Класс ниже читает данные из Firestore и заполняет массив данных: [категория], где категория - это структура.

Массив кажется хорошо заполненным, потому что когда я печатаю значения этого массива, он появляется в консоль.

class getCategoriesData: ObservableObject {

@Published var datas = [category]()

init() {
    let db = Firestore.firestore()

    db.collection("categories").addSnapshotListener { (snap, err) in

        if err != nil {

            print((err?.localizedDescription)!)
            return
        }

        for i in snap!.documentChanges {
            let id = i.document.documentID
            let name = i.document.get("name") as! String
            let pic = i.document.get("pic") as! String

            self.datas.append(category(id: id, name: name, pic: pic))
        }

        //try inside getCategoriesData
        print(self.datas)
        print(self.datas[1])
        print(self.datas[1].name)

    }
}

Но когда я вызываю мой массив из моего представления (код ниже), я получаю эту ошибку:

"Поток 1: фатальная ошибка: индекс выходит за пределы диапазона"

Кажется, что массив не распознается в представлении.

struct ContentView: View {

@State private var searchText: String = ""
@ObservedObject var categories = getCategoriesData()

var body: some View {

    VStack {

        Text(categories.datas[1].name) //here the error appears

Я не понимаю, почему я могу получить доступ к своему массиву из getCategoriesData, а я не могу внутри ContentView ..

Спасибо за ваши ответы Жан

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Я понял, как обрабатывать асинхронное извлечение из Firestore, благодаря этому коду:

if self.categories.datas.isEmpty {
                Text("")

            } else {
                Text(self.categories.datas[1].name)
            }
0 голосов
/ 26 апреля 2020

причина, по которой вы не можете получить доступ к вашему массиву из getCategoriesData, заключается в том, что "db.collection (" category "). AddSnapshotListener {(snap, err) in" является асинхронной функцией. То есть результаты этого (и, следовательно, init ()) не доступны, пока он не закончится. Изучите немного больше об асинхронных функциях и о том, где их вызывать, обычно не в init ().

...