从完成时返回闭包值的函数

时间:2018-05-16 23:16:49

标签: swift firebase firebase-realtime-database closures completionhandler

我正在尝试编写一个从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)
        // ...
    })
}

1 个答案:

答案 0 :(得分:0)

你的第二个版本已经关闭了。它应该是这样的:

userName(forUID: "UID01") { name in
  print(name)
}

由于您使用的是异步Firebase方法来获取数据,因此无法创建返回该数据的函数。这不是异步方法的工作方式。