Я пытаюсь получить результаты запроса подколлекции Firestore и затем отфильтровать список элементов на основе результатов запроса.
Я могу успешно запросить и распечатать на консоли мой Firestore запрос, однако, я немного потерял, как установить результаты запроса в массив, в котором я могу отфильтровать свой список.
При выводе значения favid из моей функции показано:
"[163, 169]"
Я борюсь с тем, как добавить этот массив в "self". data.append ... ", а затем фильтрует список в моем представлении на основе значения" data ".
Вот мой текущий код. В настоящее время он просто отображает все элементы из моей модели данных. Я хочу, чтобы он фильтровал и отображал только элементы с соответствующими идентификаторами продуктов.
import SwiftUI
import Firebase
import FirebaseFirestore
struct FavoritesView: View {
@EnvironmentObject var session: SessionStore
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@State var data: [FavoritesStore] = []
var model = Passport.all()
let db = Firestore.firestore()
func getFavorites() {
let userID = Auth.auth().currentUser?.uid ?? "nil"
if (session.session != nil) {
self.data.removeAll()
db.collection("users").document(userID).getDocument { (document, error) in
if let document = document, document.exists {
let favoriteID = document.get("favorites") as! Array<Int>
print(favoriteID as Any)
// self.data.append(FavoritesStore(favorites: favoriteID) as! Array<Any>)
// print(self.data)
} else {
print("Document does not exist")
}
}
}
}
var body: some View {
ZStack {
VStack {
List {
ForEach(self.model) { venues in
ForEach(venues.venues) { items in
ForEach(items.venueItems) { item in
VStack {
Text(item.title)
}
}
}
}
}
.listStyle(GroupedListStyle())
.navigationBarTitle(Text(""))
.resignKeyboardOnDragGesture()
.background(Color("bodyBackground"))
.onAppear(perform: getFavorites)
}
VStack {
GeometryReader { gr in
HStack {
Button(action: {self.presentationMode.wrappedValue.dismiss()}) {
Image(systemName: "chevron.left")
.foregroundColor(.black)
.padding(.leading, 16)
HStack {
Text("Explore · Favorites")
.font(.system(size: 15))
.fontWeight(.bold)
.foregroundColor(Color.black)
.padding()
Spacer()
}
}.frame(width: gr.size.width * 0.92, height: 48)
.background(Color.white)
.cornerRadius(8)
.shadow(color: Color("Shadow"), radius: 10, x: 2, y: 7)
}.padding(.leading, 16)
Spacer()
}
}
.padding(.top, 50)
.edgesIgnoringSafeArea(.top)
}
}
}
class FavoritesStore: ObservableObject {
@Published var favorites: [Favorite]
init (favorites: [Favorite]) {
self.favorites = favorites
}
}
class Favorite: ObservableObject {
var id: Int
init(id: Int) {
self.id = id
}
}
Модель паспорта
Passport (
id: 1001,
passportPremium: false,
passportActive: true,
passportTitle : "Festival of the Holidays",
passportDescription: "An International Yuletide Extravaganza Savor seasonal food & beverage specialties at the expanded Holiday Kitchens. And take a festive global tour—as costumed performers bring time-honored traditions to life throughout World Showcase!",
passportDates: "Nov. 29 - Dec. 30, 2019",
passportYear: "2019",
passportImage: "Event-Festival-Holidays",
passportImageVert: "Event-Festival-Holidays-Vert",
venues: [
Venue (
title: "Bavaria Holiday Kitchen",
venueImage: "defaultVenue",
venueDesc: "ipsum lorem",
venueArea: "World Showcase East",
coordinate: .init(latitude: -33.852222, longitude: 151.210556),
venueItems: [
venueItem (
id: 101,
title: "Potato Dumpling",
itemURL: "https://www.example.com/app/wdw-default.png",
productDescription: "Potato Dumpling with Mushroom Sauce",
productPrice: 4.50,
productType: "Food",
newStatus: false,
diningPlan: false,
kidFriendly: true,
vegetarian: false,
glutenFree: false,
featuredProduct: false,
containsAlcohol: false
),
venueItem (
id: 102,
title: "Pork Schnitzel",
itemURL: "https://www.example.com/app/wdw-default.png",
productDescription: "Pork Schnitzel with Mushroom Sauce and Spaetzle",
productPrice: 6.25,
productType: "Food",
newStatus: true,
diningPlan: false,
kidFriendly: false,
vegetarian: false,
glutenFree: false,
featuredProduct: false,
containsAlcohol: false
),
venueItem (
id: 103,
title: "Cheese Fondue",
itemURL: "https://www.example.com/app/wdw-default.png",
productDescription: "Cheese Fondue in a Bread Bowl with Fresh Steamed Baby Vegetables and Marble Potatoes",
productPrice: 8.25,
productType: "Food",
newStatus: false,
diningPlan: false,
kidFriendly: true,
vegetarian: false,
glutenFree: false,
featuredProduct: false,
containsAlcohol: false
),