我的应用内置了一个搜索功能,用于从我的firebase数据库中过滤用户。
我能够在一定程度上正确地做到这一点。问题在于每当我搜索不存在应用程序崩溃错误的用户时,node.master: true
node.data:true
这些是UICollectionViewCells,所以我处理Index out of range
中返回的单元格,我认为我编码的条件为零或零,但显然不是。
这是执行搜索的地方
numberOfItemsInSection
有什么建议吗?
答案 0 :(得分:0)
你不应该从numberOfItemsInSection
返回0而不是
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()
})
}
})
希望这有助于某人。