【发布时间】:2020-11-24 23:39:00
【问题描述】:
我正在制作一个提示卡应用程序。我将我的数据库添加到一个数组中,但是在另一个函数中调用该数组(我想对数组进行更改)时,它返回空。我在这个主题上做了很多搜索,发现我必须使用完成处理程序,我认为我已经完成了。那里有很多关于这个主题的信息,例如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)
}
}
}
【问题讨论】:
-
您应该在整个函数中添加打印语句,并查看它被捕获的位置。我将首先在 downloadCues 的开头添加一个打印以确保它被调用..在您检查快照值的函数中的另一个打印..并且可能在 initializeCues 的开头添加一个打印以确保它被调用。快速浏览一下,您可能需要在 CueCardViewModel 中添加一个 init() 才能真正调用 initializeCues?
-
我总是忽略的好建议。它似乎没有在 DataDownloader 文件的 snap.documents {} 循环中运行 for doc。
-
是否进入了“guard let snap = snap else {return}”语句?我猜它会回到那里。这意味着该函数没有在 dbRef.collection("Cues") 处获取快照。确保您访问的是正确的路径/集合。我认为它区分大小写(“提示”与“提示”)。
-
你是个读心者!我的数据库集合被命名为“Cue”而不是“Cues”。我已经为此工作了大约 4 个小时。谢谢!
-
哈哈我自己也遇到过类似的问题。我也为您发布了带有建议的答案。干杯!
标签: database firebase swiftui completionhandler