【发布时间】:2020-04-09 21:24:58
【问题描述】:
这是我第一次使用 Swift/SwiftUI 进行编程,过去几周我一直遇到一个问题。
应用程序 我正在尝试构建一个应用程序,用户在其中输入游戏数据,这些数据存储在他们的手机上,一旦答案在 firebase 数据库中可用,它将与他们进行比较并计算分数。
到目前为止,我已经能够: - 将 Firebase 集成到 iOS 应用程序中 - 我已经能够对从数据库收集的信息运行列表/foreach 循环
目前我的问题如下: 我正在尝试从 firebase 加载信息,然后使用此信息与用户数据进行比较并计算分数。当我这样做时,从 firebase 返回数据的函数返回一个空数组。
Firebase 结果函数
func getResults() {
ref.child("eventResults").observe(DataEventType.value) { (snapshot) in
self.eventResults = []
for child in snapshot.children {
if let snapshot = child as? DataSnapshot,
let event = EventResults(snapshot: snapshot) {
self.eventResults.append(event)
}
}
}
}
如果我在没有计算的情况下在 SwiftUI 视图中运行该代码,它会正确提取并显示数据,这是一个正常工作的示例视图
import SwiftUI
struct TestView: View {
@ObservedObject var session = FirebaseSession()
var body: some View {
ZStack {
Color.init(red: 221/255, green: 221/255, blue: 221/255)
.edgesIgnoringSafeArea(.all)
VStack {
List{
//
ForEach(self.session.eventResults) { event in
HStack() {
Text(event.name)
.font(.system(size: 30))
Spacer()
Text("\(event.answer)")
.font(.system(size: 30))
}
}
}.frame(width: UIScreen.main.bounds.width*0.9)
}.onAppear() {
self.getFirebaseData()
}
}
}
func getFirebaseData() {
session.getResults()
}
}
但在另一个视图中,我试图在后台计算用户分数,以便用正确的分数更新用户配置文件,我尝试了多种方法来做到这一点,但初始数组总是空的。
下面是我尝试运行的示例代码
import SwiftUI
import CoreData
struct EventList : View {
@Environment(\.managedObjectContext) var managedObjectContext
@ObservedObject var session = FirebaseSession()
@FetchRequest(entity: UserEvents.entity(),
sortDescriptors: [])
var userEvents: FetchedResults<UserEvents>
var body: some View {
ZStack {
Color.init(red: 221/255, green: 221/255, blue: 221/255)
.edgesIgnoringSafeArea(.all)
VStack {
ScrollView {
VStack(alignment: .leading) {
ForEach(userEvents) { eventVar in
EventCard(eventVar: eventVar)
.cornerRadius(0)
.shadow(color: .black, radius: 5, x: 2, y: 2.0)
.padding(.horizontal)
.frame(width: UIScreen.main.bounds.width)
}
}
}
}
}.onAppear{
self.getFirebaseData()
var testvar2 = self.session.eventResults // is empty
self.calcScores(resultlist: self.session.eventResults)
}
}
//MARK: calculate Scores
func getFirebaseData() {
session.getResults()
}
func calcScores(resultlist: [EventResults]) {
var testcount = resultlist.count // is empty
}
}
非常感谢任何帮助或指导, 丹尼尔
【问题讨论】:
标签: swift firebase firebase-realtime-database swiftui