Я пытаюсь получить некоторые данные и отобразить их в списке. Часть извлечения работает, но я почему-то не понял, как получить ее в виде списка.
Мой подход состоял в том, чтобы создать наблюдаемое внутри 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
}