Firebase 中的观察者未在 swift 应用程序中调用

Posted

技术标签:

【中文标题】Firebase 中的观察者未在 swift 应用程序中调用【英文标题】:Observer in Firebase not being called in swift app 【发布时间】:2019-11-17 23:29:29 【问题描述】:

我已经编写了一个方法 - checkUserStatus - 在 swift 中检查存储在 firebase 中的用户是“管理员”还是“创建者”。如果是,那么他们可以看到“上传按钮”。该函数在viewDidLoad中调用如下:

override func viewDidLoad() 
    super.viewDidLoad()
checkUserStatus()

方法如下:

func checkUserStatus() 
    let currentUserID = Auth.auth().currentUser?.uid
    //get the role of the current user to see if they have admin priveleges
    let userRef = Database.database().reference().child("users").child(currentUserID!)

    userRef.observe(.value, with:  (snapshot) in
        let dictionary = snapshot.value as! [String: Any]
        let role = dictionary["role"] as! String
        self.retrievedRole = role
    , withCancel: nil)

    print("retrieved role is \(retrievedRole)")
    //only those users who are admin or creators can see upload button
    if (retrievedRole == "admin") || (retrievedRole == "creator") 
        uploadButton.isHidden = false
     else 
        uploadButton.isHidden = true
    

但是,当我逐步执行该方法时,我可以看到观察者从未使用过,并直接跳转到指示检索到的Role 变量为空的“打印”行。因此,该按钮始终处于隐藏状态。我错过了什么没有使用观察者?感谢任何建议。

retrieveRole 的变量在 viewController 的顶部声明如下:

var retrievedRole = ""

【问题讨论】:

【参考方案1】:

你需要在回调中嵌入检查块,因为它的调用是异步的

userRef.observe(.value, with:  (snapshot) in
    let dictionary = snapshot.value as! [String: Any]
    let role = dictionary["role"] as! String
    self.retrievedRole = role

    print("retrieved role is \(retrievedRole)")
    //only those users who are admin or creators can see upload button
    if retrievedRole == "admin" || retrievedRole == "creator" 
       uploadButton.isHidden = false
     else 
       uploadButton.isHidden = true
    
, withCancel: nil)

【讨论】:

是的,就是这样。非常感谢。

以上是关于Firebase 中的观察者未在 swift 应用程序中调用的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 Firebase 远程通知未在 TestFlight 上显示

在 Swift 中的 Firebase 实时数据库观察方法中具有异步函数的 DispatchGroup

Swift 中的完成处理程序 Firebase 观察者

处理 Firebase childDeleted 和 childModified 观察者 Swift

使用 Firebase 观察数据更新 UI (Swift)

Swift,FIrebase - 无法通过 removeAllObservers 删除观察者