我有一个简单的iOS应用程序,该应用程序的一部分从firebase数据库中获取所有用户,因此您可以搜索它们并执行不同的功能。现在,我的问题是,如果/当应用程序增长并且有成千上万的用户,是否会将所有用户从数据库中拉出并将其添加到[用户]的数组中,仍然不会崩溃或慢慢应用程序?我在YouTube上看到这么多人只需通过Firebase循环并抓住所有用户。请注意,我不包括个人资料照片,因此没有涉及的图像,只有字符串。我有一些我认为可以解决这个可能的问题的代码,但是我开始怀疑是否只有从Firebase中获取所有用户并将其放入和数组,然后在TableView中显示的问题。
这是我现在的一些代码,但是我仍然注意到当我输入一个字母时,然后打开飞机模式,下载了所有用户。谢谢,我真的需要一些帮助或一些建议。
var checklers = [String]()
func updateSearchResults(for searchController: UISearchController) {
if searchController.searchBar.text == "" {
filteredUsers = users
}
else {
print("refreshing")
if let uidi = FIRAuth.auth()?.currentUser?.uid {
view.addSubview(activityInd)
activityInd.startAnimating()
filteredUsers.removeAll()
checklers.removeAll()
let ref = FIRDatabase.database().reference()
ref.child("users").queryOrderedByKey().observe(.value, with: { snapshot in
if let userr = snapshot.value as? [String : AnyObject] {
for (_, velt) in userr {
if let usernamerr = velt["Username"] as? String {
if usernamerr.lowercased().contains(searchController.searchBar.text!.lowercased()) {
let userNew = usera()
if let name = velt["Full Name"] as? String, let uidd = velt["uid"] as? String {
userNew.name = name
userNew.username = usernamerr
userNew.uid = uidd
if self.checklers.contains(uidd) {
print("already")
}
else {
if userNew.uid != uidi {
self.filteredUsers.append(userNew)
self.activityInd.stopAnimating()
self.checklers.append(uidd)
}
print("added a user")
}
}
}
}
self.tableViewSearchUser.reloadData()
}
}
})
ref.removeAllObservers()
}
// filteredUsers = users.filter( { ($0.username?.lowercased().contains(searchController.searchBar.text!.lowercased()))! })
}
tableViewSearchUser.reloadData()
}
请添加任何建议,谢谢。
仅用于搜索一个或两个用户时,每次用户需要获取所有记录并将它们全部放在数组中(全部在内存中)。您需要SQL-查询功能,但是Firebase只是不同的,没有它。
存储获取所有数据方法的问题:
1)仅将所有用户的信息存储在客户端设备上的一系列用户对象中。
2)当用户数量达到成千上万的用户数量时,单个用户的每天搜索就会吃掉大量的实时数据库读取配额。
3)陈旧的用户数据,用户必须重新下载所有用户,因为用户上的用户将他的名字更改为doggie1。
解决方案:
1)如果您还没有这样做,我建议您通过在此处遵循最佳练习来进行一些服务器端过滤的选择:
firebase检索数据 - 过滤
下载适合某些条件的用户子集,然后进行一些客户端过滤。当用户达到数万美元时,仍然是有问题的。
firebase具有客户大小的数据持久性功能,但是在您的情况下,如果有过滤规则不符合您的需求,则需要使用一些持久的存储解决方案自己的缓存。我不是将获取的对象放在数组[用户]中,而是将每个对象存储在iOS和Android应用程序上的数据库SQLITE中。
2)使用手电筒插件实现Elasticsearch,这涉及一些额外的设置(我知道,我已经经历了它,我学到了很多),但是对于firebase当前的自动完成和搜索功能是值得的不支持。
与Elasticsearch的可插入集成在Firebase中提供高级内容搜索。