正如标题所说我从Firebase检索简单数据时遇到了一个奇怪的问题,但我真的无法弄清楚我哪里出错了。
这是我的架构:
这个代码:
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是零。有什么建议吗?
答案 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