Ios 如何构造代码来处理异步Firebase快照?

Ios 如何构造代码来处理异步Firebase快照?,ios,swift,asynchronous,firebase,firebase-realtime-database,Ios,Swift,Asynchronous,Firebase,Firebase Realtime Database,我有一个我无法解决的问题。JS中有很多问题,我不太理解 我正在使用Firebase作为IOS应用程序和Swift的数据库这是我的情况: 我有一个类文件,其中包含可以检索数据库中的值的函数。我在一些视图控制器中调用这些函数 这些函数检索到的值立即用于这些视图控制器 我的问题是我的应用程序崩溃,因为类文件函数返回的值为零。发生这种情况的原因是异步Firebase快照 假定包含这些值的变量在赋值=>My app crash或打印值为零之前使用 那么我的问题很简单:如何构造代码来避免这个问题?我已经尝试

我有一个我无法解决的问题。JS中有很多问题,我不太理解

我正在使用Firebase作为IOS应用程序和Swift的数据库这是我的情况:

我有一个类文件,其中包含可以检索数据库中的值的函数。我在一些
视图控制器中调用这些函数

这些函数检索到的值立即用于这些
视图控制器

我的问题是我的应用程序崩溃,因为类文件函数返回的值为零。发生这种情况的原因是异步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不应该在那里,我的错。我更新了答案。