处理复杂的firebase数据库查询的null返回

时间:2017-07-23 02:56:10

标签: ios swift firebase-realtime-database

我的应用内置了一个搜索功能,用于从我的firebase数据库中过滤用户。

我能够在一定程度上正确地做到这一点。问题在于每当我搜索不存在应用程序崩溃错误的用户时,node.master: true node.data:true

这些是UICollectionViewCells,所以我处理Index out of range中返回的单元格,我认为我编码的条件为零或零,但显然不是。

这是执行搜索的地方

numberOfItemsInSection

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你不应该从numberOfItemsInSection返回0而不是

返回Int()
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
   switch section {
   case 0:
      return users.count
   case 1:
     // handle based on section 1 datasource count
}

答案 1 :(得分:0)

仔细阅读文档后,我能够推断出错误的来源。 以下是FireBase文档中的一行:

"如果指定位置没有数据,则FDataSnapshot将返回NSNull。"

因此,要正常环绕错误,您可以添加以下内容:

if snapshot.value == NSNULL {

    print("no users returned") 
} else {
//do something with data

然而,在我执行的FireBase查询中,观察的是.childAdded事件。

FireBase文档调用这些查询,复杂的查询器。在我的情况下,我使用.queryStarting.queryEnding只返回.childAdded事件,因此检查值将无法在内部查询参数,应用程序将崩溃。

解决方案是检查查询是否返回null BEFORE ,以便进行搜索。

如果您使用数据返回类似collectionView或tableView Cells的内容,这一点尤其重要。

所以要结束,我只需要在查询返回值之前添加一个参考观察,然后再用它来创建我的UICollectionViewCells。结果看起来像这样。

ref.observe(.value, with: { snap in
    if snap.value is NSNull {
        print("no users returned")
        self.users.removeAll()

        DispatchQueue.main.async(execute: {
        self.collectionView?.reloadData()
        })

    }
})

希望这有助于某人。