Swift 闭包不设置变量

标签 swift firebase firebase-realtime-database closures firebase-authentication

我试图在闭包内部设置闭包外部的变量,但它最终并没有被设置。但是,我将变量设置为 的值 正在打印到控制台。此外,在设置返回变量并自行打印之后,正确的值将打印到控制台。当我返回变量时出现问题;它的值与初始化时的值保持不变。这是一些伪代码:

let str: String = {
    var ret: String = "default value"

    functionWithClosure(with: (some_name) in {
        if let name = some_name {
            ret = name
            print(name) // prints successfully
            print(ret_name) // also prints successfully
        }
    })

    return ret // returns "default value"
}()

这是不起作用的实际代码:

let name: String = {
    var ret_name = "default value"

    if let uid = FIRAuth.auth()?.currentUser?.uid {
        FIRDatabase.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
            if let dictionary = snapshot.value as? [String: AnyObject] {
                if let name = dictionary["name"] as? String {
                    ret_name = name
                    print(ret_name)
                }
            }
        })
    }

    return ret_name
}()

最佳答案

.observeSingleEvent 正在异步工作。

你可以这样做:

func getRetname(completion: @escaping(_ retName: String) -> Void) {
    if let uid = FIRAuth.auth()?.currentUser?.uid {
        FIRDatabase.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            if let name = dictionary["name"] as? String {
                ret_name = name
                print(ret_name)
                completion(ret_name)
            }
        }
    })
}

然后,您可以在任何地方使用它:

getRetname(completion: { ret_name in 
    // ret_name - your data
})

希望对你有帮助

关于Swift 闭包不设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43534111/

相关文章:

ios - 在复杂的 NSAttributedString 中插入字符串

firebase - 当我尝试使用 Firebase 托管部署我的网站时出现错误 - 错误 : An unexpected error has occurred

javascript - 有没有一种方法可以在实时数据库中搜索特定的子值并提取其附带的其余子数据

android - 未能将 Fabric Crashlytics 升级到 Firebase Crashlytics

java - dataSnapshot.getChildren() 获取用户 ID 但不获取值

swift - 未设置 Google 地方信息自动完成委托(delegate)

ios - 如何使用 ios parse.com 将坐标保存为 PFGeopoint

ios - 在 Swift 中的 UIView 上绘制网格

swift - 用户默认值中的 Firebase ID

firebase - AngularFire2 通过子对象查询