使用Firebase

时间:2017-10-10 20:07:54

标签: swift firebase firebase-realtime-database

我有这个数据库结构:

Users
   userid1
      username : username1
      otherdata : otherdata1

   userid2
      username : username2
      otherdate : otherdata2

我正在寻找的是当一个用户在表格视图顶部使用uisearchbar时,在tableview中显示我的用户的用户名。这就是我到目前为止所拥有的:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    ref = Database.database().reference()
    let strSearch = searchBar.text
    ref.child("Users").queryOrdered(byChild: "username").queryStarting(atValue: strSearch).queryEnding(atValue: strSearch! + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
        var fetchedList = snapshot.value as! [AnyObject]
        for obj in fetchedList { 
        print(obj["username"] as? String)
   }

    }) { (err) in
        print(err)
    }
}

但是我被卡住了,因为它没有显示用户名,我的应用程序一直在崩溃,在我运行之前我得到了这个警告: "表达式隐含地来自' String?'任何" 当我用Xcode修复它时:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    ref = Database.database().reference()
    let strSearch = searchBar.text
    ref.child("Users").queryOrdered(byChild: "username").queryStarting(atValue: strSearch).queryEnding(atValue: strSearch! + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
        let fetchedList = snapshot.value as! [AnyObject]
        for obj in fetchedList {
            print(obj["username"] as Any)
        }

    }) { (err) in
        print(err)
    }
}

我的应用程序崩溃不起作用。有人能告诉我我做错了什么。

1 个答案:

答案 0 :(得分:1)

当我运行您的代码时,我收到以下错误:

Could not cast value of type 'NSNull' (0x11202a570) to 'NSArray' (0x112029d78).

所以我有几点建议:

  1. 快照可能为空,因此请务必使用if letguard语句处理此问题。

  2. 使用snapshot.children.allObjects进行迭代,而不是snapshot.Value,无法转换为数组。

  3. 另外,作为旁注,您可以将searchText参数传递给查询,而不是使用searchBar.text

    结果将是这样的:

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        ref = Database.database().reference()
        ref.child("Users").queryOrdered(byChild: "username").queryStarting(atValue: searchText).queryEnding(atValue: searchText + "\u{f8ff}").observeSingleEvent(of: .value, with: { (snapshot) in
            // cast to an array of DataSnapshots
            guard let fetchedList = snapshot.children.allObjects as? [DataSnapshot] else { return }
            // iterate through array, cast value to dictionary
            for obj in fetchedList {
                let objDict = obj.value as! [String: AnyObject]
                print(objDict["username"])
            }
        }) { (err) in
            print(err)
        }
    }