正如标题所说,我在从 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 为零。有什么建议吗?
最佳答案
我认为您可以稍微简化代码以使其更易于管理。试试这个
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/