gpt4 book ai didi

firebase - SwiftUI 和 MVVM : How to display data from Firebase/Firestore in View?

转载 作者:行者123 更新时间:2023-12-03 10:31:07 26 4
gpt4 key购买 nike

我正在从 Firebase 数据库中获取一些数据,并希望将它们显示在 View 中。获取部分到目前为止工作,但不显示数据。因为我是 MVVM 模式的新手,所以我对我的错误在哪里有点困惑。我想我遗漏了一些关于异步调用的东西,但我不确定。
为了获取数据,我创建了一个 FirestoreManager :

class FirebaseManager {
private let db = Firestore.firestore()

func getUploadedDecks() -> [FlashcardDeck]{
var uploadedDecks = [FlashcardDeck]()

db.collection(K.FSCollectionName).getDocuments { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
fatalError("error downloading documents")
}

for document in documents{
if let deck = try? document.data(as: FlashcardDeck.self) {
uploadedDecks.append(deck)
print(deck.title) // <----- prints the ID correctly
}
}
}
return uploadedDecks
}
View 模型:
class DownloadViewModel: ObservableObject {

@Published var decks = [FlashcardDeck]()
@Published var show = false

func fetchDecks(){
self.decks = FirebaseManager().getUploadedDecks()
}
}
查看:此处仅显示“正在加载...”文本字段。
struct DownloadDecksView: View {
@ObservedObject var viewModel: DownloadViewModel

var body: some View {
VStack{
if viewModel.decks == [] {
Text("loading...")
} else {
ForEach(viewModel.decks) { elem in
Flashcard(elem)
}
}
.onAppear {
viewModel.fetchDecks()
}
}


主 View :
struct HomeView: View {
@StateObject var downloadViewModel = DownloadViewModel()
...

var body: some View {
DownloadDecksView(viewModel: downloadViewModel)
...
}
}

最佳答案

这都是关于异步检索的,所以你需要在回调中返回结果,比如

class FirebaseManager {
private let db = Firestore.firestore()

func getUploadedDecks(completion: @escaping ([FlashcardDeck]) -> ()) {

db.collection(K.FSCollectionName).getDocuments { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
fatalError("error downloading documents")
}

var uploadedDecks = [FlashcardDeck]()
for document in documents{
if let deck = try? document.data(as: FlashcardDeck.self) {
uploadedDecks.append(deck)
}
}
completion(uploadedDecks) // << here !!
}
// no return !!
}
并将其用作
class DownloadViewModel: ObservableObject {

@Published var decks = [FlashcardDeck]()
@Published var show = false

func fetchDecks(){
FirebaseManager().getUploadedDecks() { [weak self] decks in
DispatchQueue.main.async {
// always update UI-linked properties on main queue
self?.decks = decks
}
}
}
}

关于firebase - SwiftUI 和 MVVM : How to display data from Firebase/Firestore in View?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65458357/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com