是否只是从firebase数据库中提取所有用户并将它们放入数组中?

时间:2017-09-15 02:26:30

标签: ios swift firebase firebase-realtime-database

我有一个简单的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()
}

请添加任何建议,谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

1)在用户对象数组中存储所有用户信息不能在客户端设备上进行扩展。

2)当用户数量达到数十万时,单个用户每天搜索一天就会占用大量的实时数据库读取配额。

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

<强>解决方案:

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

Firebase Retrieving Data - Filtering

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

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

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

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