ios - 如何从 iOS/swift 中的闭包函数返回值?

标签 ios swift asynchronous firebase closures

<分区>

我刚开始学习 IOS 开发,来自后端世界。我希望将用户 ID 传递给此函数并返回名称,所有数据都来自 Firebase。我当前试图将名称值从闭包中分离出来的尝试没有奏效,返回了空字符串。我如何着手构建此代码以获取要返回的“名称”变量。

    func getNameOfUser(uid: String) -> String {
    var name: String = ""
    FIRAuth.auth()?.signInAnonymouslyWithCompletion() { (user, error) in
        self.ref = FIRDatabase.database().reference()
        self.ref!.child("users").child(uid).child("name").observeSingleEventOfType(.Value, withBlock: { (snapshot) in
            name = snapshot.value! as! String
        }) { (error) in
            print(error.localizedDescription)
        }
    }
    return name
}

最佳答案

这行不通。 signInAnonymouslyWithCompletion() 在后台工作。

Asynchronously creates and becomes an anonymous user.

这意味着当执行完成 block 时,getNameOfUser() 及其局部变量已经消失。

func getNameOfUser(uid: String) -> String 
{
  var name: String = ""
  FIRAuth.auth()?.signInAnonymouslyWithCompletion() 
  { (user, error) in
  // Executed somewhere in the future
  }
// Executed immeditaly.
return name
}

您应该将完成 block 作为参数传递给函数并在完成 block 内执行,而不是返回结果。

关于ios - 如何从 iOS/swift 中的闭包函数返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155971/

相关文章:

ios - 仅合成 setter 来声明可变类

javascript - 在 iOS/Android 上的 HTML5 混合应用程序中持久存储的可靠方法

iOS 4.2.1 : Video files not being played by MPMoviePlayerController on iPod Touch

ios - 尝试使用 "return"按钮关闭键盘

ios - 快速调整表格单元格图像

ios - 在 Swift 3 或 4 中检查 if 条件矩阵

java - 在 Java 中连续处理异步队列的最佳方法是什么?

ios - 升级 Paypal SDK 从 2.11.2 到 2.12.0 iOS

java - 为什么 Vert.x 被称为响应式,尽管它是单线程的

java - 从 Eclipse RCP 中的向导调用复杂操作的正确方法是什么?