调用完成处理程序Firebase Swift

调用完成处理程序Firebase Swift,swift,firebase,firebase-realtime-database,closures,Swift,Firebase,Firebase Realtime Database,Closures,从firebase中检索单个值并获取它,这样我就可以在闭包之外使用它,这可能需要很多工作,但我似乎无法让任何事情变得更简单 虽然我可能创建了一个合适的处理程序,也可能没有创建,但到目前为止,它不会抛出任何错误,直到我尝试使用调用它,然后我得到:无法将“String”类型的值转换为预期的参数类型(String)->()' 怎么调用这个函数? B:有没有更简单的方法 var myName = "" func getMyName(completion: @escaping (String) ->

从firebase中检索单个值并获取它,这样我就可以在闭包之外使用它,这可能需要很多工作,但我似乎无法让任何事情变得更简单

虽然我可能创建了一个合适的处理程序,也可能没有创建,但到目前为止,它不会抛出任何错误,直到我尝试使用调用它,然后我得到:无法将“String”类型的值转换为预期的参数类型(String)->()'

怎么调用这个函数? B:有没有更简单的方法

var myName = ""

func getMyName(completion: @escaping (String) -> ()){
    if let uid = Auth.auth().currentUser?.uid{
        databaseRef.child("bodhi").child((uid)).observeSingleEvent(of: .value, with: { (snapshot) in
            if let bodhiDict = snapshot.value as? [String: AnyObject]
            {
                let myName = (bodhiDict["Name"] as? String)!
                print ("myName in the closure: \(myName)")
                completion(myName)
            } else {
                completion("")
            }
        })
    }
}

getMyName(completion: (myName))
print ("myName Outside the closure: \(myName)")

您对
getMyName
的调用不正确。更改:

getMyName(completion: (myName))
print ("myName Outside the closure: \(myName)")
致:

getMyName(completion: { (name) in
    print("Received \(name)")
})
或:


如您所见,您在函数外部声明的第一个
myName
变量是不必要的。

好的,我打印了这个,但它没有在完成块外部更改变量。那么,这是否意味着在这个变量上运行的所有其他函数都需要在它的完成块内运行,或者当页面加载时,有没有办法改变变量?如果您的初始
myName
应该更新,那么在我的答案中的
getMyName
块内添加
myName=name
。是的!它发出了一个漂亮的通知,上面写着发件人的名字。你让这个令人沮丧的周末变得值得。这是五个不同功能中最后一个丢失的链接,所以我可以在几天后将应用程序发送到beta版。一旦我得到了您的答案并理解了调用,我就从post函数中删除了getMyName函数,并将其移动到viewDidLoad,之后我就可以对变量执行任何我想要的操作。
getMyName() { (name) in
    print("Received \(name)")
}