Извлекайте данные, сохраняйте их внутри наблюдаемой и используйте их внутри представления - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь получить некоторые данные и отобразить их в списке. Часть извлечения работает, но я почему-то не понял, как получить ее в виде списка.

Мой подход состоял в том, чтобы создать наблюдаемое внутри FirebaseSession и назвать это наблюдаемым внутри моего взгляда. - Почему-то данные не появляются, хотя.

Я не думаю, что есть проблема с кодом представления, так как я проверял его перед использованием данных stati c.

struct HomeList: View {
    @State var showContent = false
    @State private var selectedShelter: Shelter?

    @ObservedObject var session = FirebaseSession()

    var body: some View {
        VStack() {
            HStack {
                HomeListTitle()
                Spacer()
            }
            .padding(.leading)
            ScrollView(.horizontal, showsIndicators: false) {
                HStack(spacing: 35) {
                    ForEach(self.session.shelters) { item in
                        ShelterView(title: item.title, background: item.image, available: item.available, distance: item.distance, gender: item.gender ?? "")
                            .contentShape(Rectangle())
                            .onTapGesture {
                                self.showContent.toggle()
                                self.selectedShelter = item
                        }
                        .sheet(item: self.$selectedShelter) { item in
                            ShelterDetailedView(shelter: item)
                        }
                    }
                }
                .padding(.leading)
                .padding(.trailing)
                .padding(.bottom, 60)
            }
            Spacer()
        }
    }
}
class FirebaseSession: ObservableObject {

    @Published var shelters: [Shelter] = []

    let ref = Firestore.firestore().collection("shelters")

    func getShelters() {
        ref.addSnapshotListener { querySnapshot, err in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(err!)")
                return
            }
            for document in documents {
                let value = document.data()
                if let shelter = Shelter(id: value["id"] as? String ?? "", title: value["title"] as? String ?? "", image: value["image"] as? String ?? "", available: value["available"] as? Bool ?? false, distance: value["distance"] as? Double ?? -1, gender: value["gender"] as? String ?? "") {
                    self.shelters.append(shelter)
                } else {
                    print("Provided data is wrong.")
                }
            }
        }

    }

}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        ...

        let session = FirebaseSession()
        session.getShelters()

        return true
}

1 Ответ

1 голос
/ 13 января 2020

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

В вашем AppDelegate вы создаете переменную с именем sessions и делаете sessions.getShelters(). Эта переменная в настоящее время не используется вне метода, в котором она определена.

Отдельно в struct HomeList вы создаете другую переменную с

@ObservedObject var session = FirebaseSession()

, но никогда не запускаете getShelters().

Подумайте об использовании

onAppear { self.session.getShelters() }

в вашем представлении HomeList для загрузки укрытий.

// ...
    var body: some View {
        VStack() {
            HStack {
                HomeListTitle()
                Spacer()
            }
            .padding(.leading)
            ScrollView(.horizontal, showsIndicators: false) {
                HStack(spacing: 35) {
                    ForEach(self.session.shelters) { item in
                        ShelterView(title: item.title, background: item.image, available: item.available, distance: item.distance, gender: item.gender ?? "")
                            .contentShape(Rectangle())
                            .onTapGesture {
                                self.showContent.toggle()
                                self.selectedShelter = item
                        }
                        .sheet(item: self.$selectedShelter) { item in
                            ShelterDetailedView(shelter: item)
                        }
                    }
                }
                .padding(.leading)
                .padding(.trailing)
                .padding(.bottom, 60)
            }
            Spacer()
        }
        .onAppear { self.session.getShelters() }
    }
// ...

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