Ios 如何构造代码来处理异步Firebase快照?
我有一个我无法解决的问题。JS中有很多问题,我不太理解 我正在使用Firebase作为IOS应用程序和Swift的数据库这是我的情况: 我有一个类文件,其中包含可以检索数据库中的值的函数。我在一些Ios 如何构造代码来处理异步Firebase快照?,ios,swift,asynchronous,firebase,firebase-realtime-database,Ios,Swift,Asynchronous,Firebase,Firebase Realtime Database,我有一个我无法解决的问题。JS中有很多问题,我不太理解 我正在使用Firebase作为IOS应用程序和Swift的数据库这是我的情况: 我有一个类文件,其中包含可以检索数据库中的值的函数。我在一些视图控制器中调用这些函数 这些函数检索到的值立即用于这些视图控制器 我的问题是我的应用程序崩溃,因为类文件函数返回的值为零。发生这种情况的原因是异步Firebase快照 假定包含这些值的变量在赋值=>My app crash或打印值为零之前使用 那么我的问题很简单:如何构造代码来避免这个问题?我已经尝试
视图控制器中调用这些函数
这些函数检索到的值立即用于这些视图控制器
我的问题是我的应用程序崩溃,因为类文件函数返回的值为零。发生这种情况的原因是异步Firebase快照
假定包含这些值的变量在赋值=>My app crash或打印值为零之前使用
那么我的问题很简单:如何构造代码来避免这个问题?我已经尝试过完成,但这对我不起作用:函数仍然是异步的
这是我在类文件中的一个函数:
func initAverageMark(completionHandler: @escaping (_ mark: Double) -> ()) {
let userRef = ref.child("users").child((user?.uid)!).child("mark")
userRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in
if let mark: Double = snapshot.value as? Double {
completionHandler(mark)
}
}) { (error) in
print(error.localizedDescription)
}
}
private var totalAsks: Double!
override func viewDidLoad() {
super.viewDidLoad()
initInfos()
}
func initInfos() {
mainUser().initTotalAsks{ total in
self.totalAsks = total
}
initLabels()
}
func initLabels() {
totalAsksLabel.text = " \(totalAsks!)" // it crashs here
}
我的viewController代码之一:
func initAverageMark(completionHandler: @escaping (_ mark: Double) -> ()) {
let userRef = ref.child("users").child((user?.uid)!).child("mark")
userRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in
if let mark: Double = snapshot.value as? Double {
completionHandler(mark)
}
}) { (error) in
print(error.localizedDescription)
}
}
private var totalAsks: Double!
override func viewDidLoad() {
super.viewDidLoad()
initInfos()
}
func initInfos() {
mainUser().initTotalAsks{ total in
self.totalAsks = total
}
initLabels()
}
func initLabels() {
totalAsksLabel.text = " \(totalAsks!)" // it crashs here
}
假设您希望将viewController中的某个标签或其他内容设置为mark的值,您可以这样做
mainUser().initTotalAsks { mark in
self.totalAsksLabel.text = " \(mark)"
}
编辑
或者如果你真的想用那双
private var totalAsks: Double? = nil {
didSet {
initLabels()
}
}
override func viewDidLoad() {
super.viewDidLoad()
initInfos()
}
func initInfos() {
mainUser().initTotalAsks{ total in
self.totalAsks = total
}
}
func initLabels() {
guard totalAsks != nil else {
return
}
totalAsksLabel.text = " \(totalAsks!)"
}
这是《也许会告诉我们它真正崩溃的地方》的转载?@Pieter Laebens更新!我添加了一个我的viewController代码。哇,从来没有想过第二种方法!!我试试看,会给你答案的!好吧,你救了我的命!谢谢你,伙计!!我一直在寻找这个答案!;)对于guard let的第二个错误:条件中的变量绑定需要一个initializerYeah,let不应该在那里,我的错。我更新了答案。