【问题标题】:Function that returns the value from a closure with completion从带有完成的闭包返回值的函数
【发布时间】: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


【解决方案1】:

您的第二个版本已接近。应该是这样的:

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

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

【讨论】:

  • 你的代码最后一行多了一个括号)
  • 所以我做到了。谢谢。 (固定)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多