2016-09-26 58 views
0

我有以下功能观察我的数据库的子节点的值解析字典值:无法分配从FIRDatabase

func findUser() { 

    let tempUser = "jordan" 

    let firRef = FIRDatabase.database().reference() 

    let userRef = firRef.child("user-referances") 

    var username:String? 

    userRef.observe(.value, with: { (snapshot) in 

     if let dictionary = snapshot.value as? [String:AnyObject] { 
      print(snapshot) 

      print(dictionary) 
      username = dictionary["username"] as? String 
      //print("usernam) 
      if username == tempUser { 
       print("username exists") 

       print(username) 
       //return 

      }else { 
       print("username not found") 
      } 
     } 

     }) { (error) in 
      print(error) 
    } 
} 

当我尝试字典值赋给一个字符串,并加以比较,它不分配它。但是,当我打印字典值时,值是在那里。

console screenshot

回答

0

据我可以理解你的代码,你正在检查用户名是否已经存在。使用它来查找用户名,而不是迭代所有用户名。

userRef.child("user-referances").queryOrdered(byChild: "username").queryEqual(toValue: "tempUser").observeSingleEvent(of: .value, with: {(snap) in 


     if let snapDict = snap.value as? [String:AnyObject] { 

      for each in snapDict{ 

       let stringName = each.value["username"] as! String 
       print("username for :\(each.key) is : \(stringName)") 
      } 

     }else{ 

      //That username doesnt exists. 

     } 

    }) 

检查: - Firebase : If username already exists.

+0

我不一定检查当前用户,但我检查,如果一个值(可以说字符串值)存在于特定的子节点。屏幕截图显示该值存在,但我可以将其分配给字符串变量。你的代码确实让我回到了我正在寻找的特定用户,但我不能将字典值赋给字符串或任何变量。 – latipov15

0

我不知道iOS开发,但是当我看到您的控制台的屏幕截图,然后看看你的代码,我想我可能会看到一些错误。

您使用print(dictonary),你会得到:

["kszzbjya8HY1IsV1Iek02FKFxtj1": { 
    username = max; 
}, "QW3V9o08zuele3BkfmPCM33m4K52": { 
    username = jordan; 
}] 

这意味着该变量的字典等于数据的整个块。

然而,然后尝试说:

username = dictionary["username"] as? String 

难道你必须首先得到每个孩子,并检查它的用户名分别?

同样,我没有iOS或swift的知识,所以如果我在这里休息,让我知道。但除非你把这个值赋给用户名的那一行是某种Swift自动迭代快照子节点的方式,那么我认为这可能是你的问题。