【问题标题】:calling a completion handler Firebase Swift调用完成处理程序 Firebase Swift
【发布时间】:2018-10-23 14:30:52
【问题描述】:

从 firebase 检索单个值并获取它可能需要做很多工作,以便我可以在闭包之外使用它,但我似乎无法做任何更简单的工作......

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

A:如何调用函数? 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)")

【问题讨论】:

    标签: swift firebase firebase-realtime-database closures


    【解决方案1】:

    您对getMyName 的呼叫不正确。变化:

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

    到任一:

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

    或:

    getMyName() { (name) in
        print("Received \(name)")
    }
    

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

    【讨论】:

    • 好的,我要打印这个,但它没有更改完成块之外的变量。那么这是否意味着对这个变量进行操作的所有其他函数都需要在它的完成块内运行,或者有没有办法在页面加载时改变变量?
    • 是的!它并发送带有发件人姓名的漂亮通知。你让这令人沮丧的周末变得值得。这是大约五个不同功能中最后一个缺失的链接,因此我可以在几天内将该应用程序发送到测试版。一旦我得到你的答案并弄清楚了电话,我从 post 函数中删除了 getMyName 函数并将它移动到 viewDidLoad ,然后让我对变量做任何我想做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多