返回语句在Swift中使用Firebase时出错

时间:2017-05-08 18:27:36

标签: swift firebase firebase-realtime-database username observers

我创建了一个连接到firebase的函数,转到特定路径然后给我值。当我打印(snapshot.value)时,它给了我需要的值。当我调用该函数时,userProfile为空。我需要userProfile来返回快照String。

 func getUserData(uid: String) -> String{
   var _REF_USERNAME = FIRDatabase.database().reference().child("users").child(uid).child("profile").child("username")

     var userProfile = String()


    _REF_USERNAME.observe(.value, with: {(snapshot) in
        print("SNAP: \(snapshot.value)")
            userProfile = snapshot.value as! String

    })
    print(userProfile)
    return userProfile
}

1 个答案:

答案 0 :(得分:2)

Swift 3

您在observe中的回调之外调用userProfile,因此它将在observe函数异步完成之前执行。回调一开始很难理解,但一般的想法是你的代码不是从上到下依次运行,并且代码的某些部分在后台线程中异步运行。

要访问userProfile,您必须传递一个回调函数:

func observeUserProfile(completed: @escaping (_ userProfile: String?) -> ()) -> (FIRDatabaseReference, FIRDatabaseHandle) {

    let ref = _REF_USERNAME

    let handle = ref.observe(.value, with: {(snapshot) in
            if !snapshot.exists() { // First check if userProfile exists to be safe
                completed(nil)
                return
            }
            userProfile = snapshot.value as! String
            // Return userProfile here in the callback
            completed(userProfile)
    })
    // Good practice to return ref and handle to remove the handle later and save memory
    return ref, handle

你在传递回调函数的同时在外面调用这个观察代码:

let ref, handle = observeUserProfile(completed: { (userProfile) in
     // Get access to userProfile here
     userProfile
}

当你完成这个观察者时,通过执行以下操作来阻止它观察以节省内存:

ref.removeObserver(withHandle: handle)