简单地从firebase数据库中提取所有用户并将它们放入一个有效的数组中吗?

Posted

技术标签:

【中文标题】简单地从firebase数据库中提取所有用户并将它们放入一个有效的数组中吗?【英文标题】:Does simply pulling all users from firebase database and putting them into an array efficient? 【发布时间】:2018-02-24 03:04:38 【问题描述】:

我有一个简单的 ios 应用程序,该应用程序的一部分从 firebase 数据库中获取所有用户,以便您可以搜索他们并执行不同的功能。现在我的问题是,如果/当应用程序增长并且有成千上万的用户时,是否从数据库中提取所有用户并将它们添加到 [user] 的数组中,仍然不会崩溃或减慢应用程序?我在 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()

请添加任何建议,谢谢。

【问题讨论】:

【参考方案1】:

只是为了搜索一两个用户,每次用户都需要获取所有记录并将它们全部放入一个数组中(全部在内存中)。您想要 SQL-where 查询功能,但 Firebase 只是与众不同,没有它。

存储获取所有数据方法的问题:

1) 在用户对象数组中仅存储所有用户信息在客户端设备上是不可扩展的。

2) 当用户数达到一万时,单个用户一天的搜索将消耗相当大的实时数据库读取配额。

3) 过时的用户数据,用户必须重新下载所有用户,因为用户将他的名字从 Doggie1 更改为 doggieTwo。

解决方案:

1) 如果您还没有这样做,我建议您先按照此处的最佳做法进行一些服务器端过滤:

Firebase Retrieving Data - Filtering

下载符合某些条件的用户子集,然后进行一些客户端过滤。当用户达到数万时仍然存在问题。

Firebase 具有客户端大小的数据持久性功能,但在您的情况下,如果过滤规则不符合您的需求,您需要自己的缓存和一些持久性存储解决方案。我不会将获取的对象放在 Array[User] 中,而是将每个对象存储在 iOS 和 android 应用程序上的数据库 SQLite 中。

2) 使用 FlashLight 插件实现 ElasticSearch,这涉及一些额外的设置(我知道,我已经通过它,我学到了很多),但是对于 Firebase 当前的自动完成和搜索功能来说,这是非常值得的不支持。

A pluggable integration with ElasticSearch to provide advanced content searches in Firebase.

【讨论】:

以上是关于简单地从firebase数据库中提取所有用户并将它们放入一个有效的数组中吗?的主要内容,如果未能解决你的问题,请参考以下文章

当数据存在时,Swift firebase 快照返回 null

从 Firebase 提取的数据中没有出现 UITableViewCells

从 firebase 检索数据并将其显示在可扩展的 recyclerview 中

将数据从 Firebase 提取到 RecyclerView 时出错。致命异常:...没有定义无参数构造函数

将数据从 Firebase 提取到 RecyclerView 时出错。致命异常:...没有定义无参数构造函数

使用flutter将多张图片上传到firestore并获取它的下载URL并将所有URL保存到firebase