Swift未在return语句中设置值
我有一个我认为不应该成为问题的问题 当我加载这个“简单”函数时,它应该返回数据库中的用户Swift未在return语句中设置值,swift,return,Swift,Return,我有一个我认为不应该成为问题的问题 当我加载这个“简单”函数时,它应该返回数据库中的用户 - returns usersDictionary: All the users in a dictionary */ func getAllUsers() -> Dictionary<String, AnyObject> { var usersDict = Dictionary<String, AnyObject>() if userIsLoggedIn
- returns usersDictionary: All the users in a dictionary
*/
func getAllUsers() -> Dictionary<String, AnyObject> {
var usersDict = Dictionary<String, AnyObject>()
if userIsLoggedIn() == true{
FIRDatabase.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
if let userDictionary = snapshot.value as? [String:AnyObject]{
for user in userDictionary{
usersDict.updateValue(user.value as AnyObject
, forKey: user.key as String)
}
print("TEST")
print(usersDict)
}
print("TEST2")
print(usersDict)
})
print("TEST3")
print(usersDict)
return usersDict
}
return usersDict
}
@瓦迪安的评论恰到好处:当异步获取数据时,您正试图在函数中同步返回一个值。您的
//代码行发生的一切
FIRDatabase.database().reference().child("users").observeSingleEvent(of: .value, with: { (snapshot) in
// ...
// lines of code
// ...
})
正在异步进行。含义:它发生在后台,在observeSingleEvent
调用之后,您拥有的任何代码都将首先执行,因此您将TEST3
视为第一行输出
有几种不同的方法可以围绕应用程序设计代码。最简单的方法可能是在异步代码执行完毕后传递一个回调函数来调用
听起来很困惑?别担心,一开始会让人困惑,但一旦你明白了,你会惊讶于这个概念是多么简单
我不打算解释回调和异步是如何工作的,但我会告诉您一个非常好的答案。看一看,你就会明白了
祝你好运 谢谢你们的回答,可能有点太晚了,因为我跳过了这一部分,专注于其他事情,但我今天看了,并设法做到了,最后非常简单
func loadBusiness(busUID: String,with completion: @escaping(_ business: [String:AnyObject], _ error: NSError?) -> Void){
FIRDatabase.database().reference().child("businesses").child(busUID).observeSingleEvent(of: .value, with: { (snapshot) in
if let busDict = snapshot.value as? [String:AnyObject]{
completion(busDict, nil)
}
}) { (error) in
print("Error occured: " + error.localizedDescription)
}
}
这只是一个简单的例子,说明我是如何做到这一点的,我现在可以用以下方法在任何地方调用它:
// Load basic company info
db.loadBusiness(busUID: db.getMyUID()) { (business, error) in
self.myCompany = business
}
这一点也不奇怪:observeSingleEvent
异步工作,稍后在闭包中返回数据。您需要一个完成处理程序,直接返回某些内容是不可能的
// Load basic company info
db.loadBusiness(busUID: db.getMyUID()) { (business, error) in
self.myCompany = business
}