【发布时间】:2018-10-27 02:50:40
【问题描述】:
我正在尝试编写一个从 Firebase 请求闭包返回值的函数。
不幸的是,我还没有完全掌握闭包和完成处理程序。
我想像这样使用和调用这个函数:
let name = userName(forUID: “UID01”)
不是这样的:
let name = userName(forUID: "UID01") { name in
print(name)
}
我之所以要这样使用它是因为这个函数会在代码的很多地方被调用,而且我希望我的代码尽可能的简洁明了。否则,我可以声明一个全局变量并在函数体内使用self.name = name。但是,例如,如果我调用这个函数 5 次,我将不得不声明 5 个全局变量...
函数如下所示:
func userName(forUID: String, completion: @escaping (_ name: String) -> ()) {
var ref: DatabaseReference!
ref = Database.database().reference()
ref.child("users").child(forUID).observeSingleEvent(of: .value, with: { (snapshot) in
let data = snapshot.value as? NSDictionary
let name = data?["name"] as? String ?? ""
completion(name)
// ...
})
}
【问题讨论】:
-
首先
let name = userName(forUID: "UID01") { name in print(name) })是错误的。userName函数不返回任何内容(或者准确地说,它返回Void,因此将Void存储在变量中是没有意义的。其次,由于 Firebase 函数是异步的,因此您不能使用name值,就像它是从同步方法返回的一样。使用完成处理程序是最简单的解决方案,但是您应该研究如何处理异步方法,因为还有其他一些方法。
标签: swift firebase firebase-realtime-database closures completionhandler