Google cloud firestore 将数据从firebase提取到SwiftUI

Google cloud firestore 将数据从firebase提取到SwiftUI,google-cloud-firestore,swiftui,Google Cloud Firestore,Swiftui,我正在学习SwiftUI并使用firebase做一个简单的应用程序。 我的问题是获取数据(实时) 下面是该应用程序的工作原理。 我有贷款对象和付款对象 在第一个视图(列表)中,我实时获取所有贷款,可以添加/删除,并且可以正常工作。 当我点击任何贷款对象时,它将带我进入第二视图(付款),在那里我插入了该贷款的所有付款。为了下载我的付款,我需要提供我的loanId,以便firebase将筛选我的付款,并仅向我发送所选贷款的付款。问题是,当我在转换过程中将我的loanId传递到我的payments视图

我正在学习SwiftUI并使用firebase做一个简单的应用程序。 我的问题是获取数据(实时)

下面是该应用程序的工作原理。 我有贷款对象和付款对象

在第一个视图(列表)中,我实时获取所有贷款,可以添加/删除,并且可以正常工作。 当我点击任何贷款对象时,它将带我进入第二视图(付款),在那里我插入了该贷款的所有付款。为了下载我的付款,我需要提供我的loanId,以便firebase将筛选我的付款,并仅向我发送所选贷款的付款。问题是,当我在转换过程中将我的loanId传递到我的payments视图时,我不知道该怎么做,因为我下载我的付款的模型在我转移loanId之前被调用

任何建议都将不胜感激

这是我在LoansView中的代码 结构LoansView:View{

 @State private var showingAddLoan = false
    @ObservedObject var dataListener = LoanListener()

    var body: some View {

        NavigationView {
            List(dataListener.loans) { loan in

                NavigationLink(destination: LoanDetailView(loan: loan)) {
                    ListCell(loan: loan)
                }

            }
            .navigationBarTitle("All Loans")
            .navigationBarItems(trailing:

                Button(action: {
                    self.showingAddLoan.toggle()
                }) {
                    Image(systemName: "plus")
            })
                .sheet(isPresented: self.$showingAddLoan) {
                    AddLoanView()
            }

        }

    }
}
我的借书人

import Foundation
import Firebase

class LoanListener: ObservableObject {

    @Published var loans = [Loan]()

    init() {
        downloadLoans()
    }

    func downloadLoans() {

        FirebaseReference(.User).document("1234").collection(kLOAN_PATH).addSnapshotListener { (snapshot, error) in

            guard let snapshot = snapshot else {  return }

            if !snapshot.isEmpty {

                self.loans = LoanListener.loanFromDictionaries(snapshot)

            }

        }
    }

    static func loanFromDictionaries(_ snapshot: QuerySnapshot) -> [Loan] {

        var allLoans: [Loan] = []


        for loanData in snapshot.documents {

            allLoans.append(Loan(loanData.data() as NSDictionary))
        }

        return allLoans
    }

}
这是我的支付侦听器,但问题是我必须向它提供loanId才能获得正确的支付

import Foundation
import Firebase

class PaymentListener: ObservableObject {

    @Published var payments = [Payment]()

    init(forLoan: Loan) {
        downloadPayments(forLoan)
    }

    func downloadPayments(_ forLoan: Loan) {

        FirebaseReference(.User).document("1234").collection(kPAYMENT_PATH).whereField(kLOANID, isEqualTo: forLoan.id).addSnapshotListener { (snapshot, error) in

            guard let snapshot = snapshot else {  return }
            print("too")
            if !snapshot.isEmpty {
                print("have")
                self.payments = PaymentListener.paymentFromDictionaries(snapshot)
                print(self.payments.count)
            }

        }
    }

    static func paymentFromDictionaries(_ snapshot: QuerySnapshot) -> [Payment] {

        var allPayments: [Payment] = []


        for paymentData in snapshot.documents {

            allPayments.append(Payment(paymentData.data() as NSDictionary))
        }

        return allPayments
    }

}
这是我的付款视图,我想在这里显示每笔贷款的付款情况

struct LoanDetailView: View {

    @State var showingAddPayment = false

    var loan: Loan
    @ObservedObject var allPayments = PaymentListener(forLoan: loan)

    var body: some View {

        List(allPayments) { payment in
            PaymentCell(payment: payment)
        }
        .navigationBarTitle("loan.name", displayMode: .inline)
        .navigationBarItems(trailing:

            Button(action: {
                self.showingAddPayment.toggle()
            }) {
                Image(systemName: "plus")
        })
            .sheet(isPresented: self.$showingAddPayment) {
                AddPaymentView(loanId: self.loan.id)
        }

    }
}
但我明白了

您能告诉我您是如何从firebase获取和管理数据的,以及您是如何通过贷款的方式在
LoandDetailsView
a
属性中创建
贷款的。另外,从
PaymentListener
的初始化器中删除
forLoan
,并将其设置为
PaymentListener上的属性e> 最后,在
LoanDetailView
的初始化器中,设置一个联合管道,订阅
loan
发布者,并在
PaymentListener
上随时更新
loan
属性。您能告诉我如何从firebase获取和管理数据,以及如何传递loanIdTry maki吗在
LoanDetailsView
a
@发布的
属性中删除
loan
。另外,从
PaymentListener
的初始化器中删除
forLoan
,并将其作为
PaymentListener
上的属性。最后,在
LoanDetailsView
的初始化器中,设置订阅
贷款的联合管道ode>publisher,并随时更新
PaymentListener
上的
loan
属性。