ios - 无法使用 Swift 从 Firebase 检索数据

标签 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 为零。有什么建议吗?

最佳答案

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

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
}

??如果节点为零(即不存在),将为 down 和 up 变量指定默认值 false

哦 - 尝试从 Firebase 异步调用(闭包)返回数据并不会真正起作用(按原样)。

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

一旦您调用 Firebase 函数,在 Firebase 有机会从服务器获取数据并填充返回变量之前,您的代码就会愉快地移至下一行。换句话说 - 不要这样做。

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

Run code only after asynchronous function finishes executing

关于ios - 无法使用 Swift 从 Firebase 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47893721/

相关文章:

ios - 是否可以突出显示 tableView 单元格内的文本子字符串?

ios - 如何在 Swift 中使用 accessoryType?

ios - 更改 com.apple.wifi.plist 中的系统属性

ios - 自定义导航栏图像 - iOS 7

ios - Swift - 推送到新 ViewController 时黑色底栏

ios - 带有 swift 的动画宽度标签

firebase - 如何安装非官方 Firebase 扩展

android - Firebase 云消息传递 : How to set the notification icon on android?

ios - Firebase 查询只返回新帖子?

javascript - Firebase 查询后返回 Promise