Google cloud firestore 将数据从firebase提取到SwiftUI
我正在学习SwiftUI并使用firebase做一个简单的应用程序。 我的问题是获取数据(实时) 下面是该应用程序的工作原理。 我有贷款对象和付款对象 在第一个视图(列表)中,我实时获取所有贷款,可以添加/删除,并且可以正常工作。 当我点击任何贷款对象时,它将带我进入第二视图(付款),在那里我插入了该贷款的所有付款。为了下载我的付款,我需要提供我的loanId,以便firebase将筛选我的付款,并仅向我发送所选贷款的付款。问题是,当我在转换过程中将我的loanId传递到我的payments视图时,我不知道该怎么做,因为我下载我的付款的模型在我转移loanId之前被调用 任何建议都将不胜感激 这是我在LoansView中的代码 结构LoansView:View{Google cloud firestore 将数据从firebase提取到SwiftUI,google-cloud-firestore,swiftui,Google Cloud Firestore,Swiftui,我正在学习SwiftUI并使用firebase做一个简单的应用程序。 我的问题是获取数据(实时) 下面是该应用程序的工作原理。 我有贷款对象和付款对象 在第一个视图(列表)中,我实时获取所有贷款,可以添加/删除,并且可以正常工作。 当我点击任何贷款对象时,它将带我进入第二视图(付款),在那里我插入了该贷款的所有付款。为了下载我的付款,我需要提供我的loanId,以便firebase将筛选我的付款,并仅向我发送所选贷款的付款。问题是,当我在转换过程中将我的loanId传递到我的payments视图
@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
属性。