无法使用Swift从Firebase检索数据

时间:2017-12-19 19:12:39

标签: ios swift firebase firebase-realtime-database

正如标题所说我从Firebase检索简单数据时遇到了一个奇怪的问题,但我真的无法弄清楚我哪里出错了。

这是我的架构:

enter image description here

这个代码:

import Firebase

let DB_BASE = Database.database().reference()

class FirebaseService {

    static let instance = FirebaseService()

    private var REF_BASE = DB_BASE
    private var REF_SERVICE_STATUS = DB_BASE.child("Service_Status")

    struct ServiceStatus {
        var downloadStatus: Bool
        var uploadStatus: Bool
    }

    func getServiceStatus() -> (ServiceStatus?) {
        var serviceStatus: ServiceStatus?

        REF_SERVICE_STATUS.observeSingleEvent(of: .value) { (requestSnapshot) in

            if let unwrapped = requestSnapshot.children.allObjects as? [DataSnapshot] {
                for status in unwrapped {
                    serviceStatus.downloadStatus = status.childSnapshot(forPath: "Download_Status").value as! Bool
                    serviceStatus.uploadStatus = status.childSnapshot(forPath: "Upload_Status").value as! Bool
                }
                // THANKS TO JAY FOR CORRECTION
                return sponsorStatus
            }
        }
    }
}

但最后serviceStatus是零。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为您可以稍微简化一下代码,使其更易于管理。试试这个

let ssRef = DB_BASE.child("Service_Status")
ssRef.observeSingleEvent(of: .value) { snapshot in
    let dict = snapshot.value as! [String: Any]
    let down = dict["Download_Status"] ?? false
    let up = dict["Upload_Status"] ?? false
}

??如果节点为零(即不存在),将给向下和向上变量的默认值为假

哦 - 尝试从Firebase异步调用(闭包)返回数据并不是真的有效(按原样)。

请记住,普通函数通过代码同步传播,然后将值返回给调用函数,然后调用函数继续执行下一行代码。

只要您调用Firebase功能,您的代码就会很快转移到下一行,然后 Firebase有机会从服务器获取数据并填充return var。换句话说 - 不要这样做。

总有其他选择,请查看此链接

Run code only after asynchronous function finishes executing