SwiftUI + Firestore - список фильтров на основе массива, возвращенного из Firestore - PullRequest
1 голос
/ 05 января 2020

Я пытаюсь получить результаты запроса подколлекции 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
                        ),

1 Ответ

0 голосов
/ 06 января 2020

если я правильно понимаю, вы можете попробовать что-то вроде этого

    for document in querySnapshot!.documents {
          print("\(document.documentID) => \(document.data())")
          let favoriteID = document.data("productID") as Int
          if let row = self.model.firstIndex(where: { $0.productID != favoriteID  }) {
              self.model.remove(at: row)
          } 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...