Return Firebase 数据库数组到另一个函数但 Return 为空

Return Firebase Database Array To Another Function But Returns Empty

我正在制作 Cue Card 应用程序。我将我的数据库添加到一个数组中,但是在另一个函数中调用该数组时(我想对数组进行更改),它 returns 为空。我对这个主题做了很多搜索,发现我必须使用完成处理程序,我想我已经完成了。那里有很多关于这个主题的信息,例如 https://firebase.googleblog.com/2018/07/swift-closures-and-firebase-handling.html 但我似乎无法让它适用于我的应用程序。 提示卡视图:

import SwiftUI

struct CueCardView: View {

var viewModel = CueCardViewModel()
@State private var isShowingAnswer = false

var body: some View {
    ZStack{
        RoundedRectangle(cornerRadius: 25, style: .continuous)
            .fill(Color.white)
        VStack{
              Text("heloo")
                .onAppear{
                    self.viewModel.initializeCues()
                }
        }
        .padding(20)
        .multilineTextAlignment(.center)
    }
    .onTapGesture {
        self.isShowingAnswer.toggle()
    
    }
    
}


}

struct C1_Previews: PreviewProvider {
static var previews: some View {
    
    CueCardView().previewDevice("iPhone 12")
}

}

提示卡型号:

import SwiftUI

struct CueCardModel : Identifiable {
var id: String = UUID().uuidString
var term: String
var answer: String
}

下载数据:

import SwiftUI
import Firebase

var dbRef = Firestore.firestore()
struct DataDownloader {
func downloadCues(completion: @escaping ([CueCardModel]) -> Void) {
    var array = [CueCardModel]()
    dbRef.collection("Cues").getDocuments(){(snap, err) in
        if let err = err {
            print(err)
        } else {
            guard let snap = snap else {return}
            
                for doc in snap.documents {
                let id = doc.documentID
                let term = doc.get("term") as! String
                let answer = doc.get("answer") as! String
                let cue = CueCardModel(id: id, term: term, answer: answer)
                array.append(cue)
            }
            completion(array)
        }
    }
}
}

提示卡视图模型:

import SwiftUI
import Firebase

class CueCardViewModel: ObservableObject {

let dataDownloader = DataDownloader()

func initializeCues() {
    dataDownloader.downloadCues() { array in
        print(array)
    }
    
}
}

确保查询路径与您在 Firebase 中设置的路径完全相同。我建议为所有集合的名称创建一个结构(可能还为每个集合中的每个字段创建额外的结构),以避免在进行查询时输入显式字符串。将所有数据库字段保持小写也是常见的做法,以避免区分大小写的字符串问题。例如:

创建一个包含集合的全局结构:

struct DatabaseCollections {
    static let cue = "cue"
    static let nextCollection = "collection_two"
}

用法:

dbRef.collection(DatabaseCollections.cue).getDocuments...