我正在制作提示卡应用。我将数据库添加到一个数组,但是在另一个函数中调用该数组(我要在其中进行更改)后,它返回空值。我对此主题进行了很多搜索,发现我必须使用完成处理程序,我认为我已经完成了。关于此主题的信息很多,例如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(可能为每个集合中的每个Field创建额外的Struct),以避免在进行查询时键入明确的字符串。避免所有数据库字段都使用小写字母也是常见的做法,以避免区分大小写的字符串问题。例如:
使用集合创建全局Struct:
struct DatabaseCollections {
static let cue = "cue"
static let nextCollection = "collection_two"
}
用法:
dbRef.collection(DatabaseCollections.cue).getDocuments...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句