只是简单地将所有用户从firebase数据库中提取并将其效率放置在阵列中



我有一个简单的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中提供高级内容搜索。

最新更新