【问题标题】:Return Statement Error using Firebase in Swift在 Swift 中使用 Firebase 的返回语句错误
【发布时间】:2017-10-06 21:05:44
【问题描述】:

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

 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
}

【问题讨论】:

  • 在从 Firebase 返回数据之前执行返回。 Firebase 数据在闭包内变为有效。请参阅我对this questionthis one 的回答。您通常不应尝试从 Firebase 函数返回数据,因为它是异步的,而您的其余代码是同步的。

标签: swift firebase firebase-realtime-database observers


【解决方案1】:

斯威夫特 3

您在观察回调之外调用 userProfile,因此它将在观察函数异步完成之前执行。回调一开始很难理解,但大意是你的代码不是从上到下顺序运行的,有部分代码是在后台线程中异步运行的。

要访问 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)

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 2013-10-06
    • 2017-11-30
    • 2022-01-17
    • 2015-01-05
    • 1970-01-01
    • 2013-11-26
    • 2013-04-27
    • 2011-11-01
    相关资源
    最近更新 更多