【问题标题】:Most efficient way to fetch data from Firebase从 Firebase 获取数据的最有效方法
【发布时间】:2018-07-21 02:05:59
【问题描述】:

我正在获取当前用户的朋友并将用户存储在一个数组中,该数组会显示在集合视图中。朋友集合视图位于我的主视图控制器上,这意味着它始终保留在用户堆栈中

我的问题是,如果用户通过用户个人资料页面添加或删除朋友,然后导航回主页视图,我必须重新获取数据并刷新 viewWillAppear 中的集合视图.这使得应用程序的数据成本很高,我绝对认为这不是最有效的方式。

我知道 Firebase 允许我设置观察者,但是我不太确定在不接收大量数据的情况下执行此操作的最佳方法。

这是我目前获取用户朋友的方式

func fetchFriends() {

    let userID = Auth.auth().currentUser?.uid
    var tempFriend = [UserClass]()

    self.usersArray.removeAll()
    collectionView.reloadData()

    let friendRef = self.databaseRef.child("users").child(userID!).child("Friends")
    friendRef.queryOrderedByKey().observe(.childAdded, with: { (snapshot) in

        let friendID = "\(snapshot.value!)"
        let usersRef = self.databaseRef.child("users")

        usersRef.observeSingleEvent(of: .value, with: { (users) in

            for user in users.children {
                let friend = UserClass(snapshot: user as! DataSnapshot)

                if friendID == friend.uid {
                    tempFav.append(friend)
                }
            }
            self.usersArray = tempFav
            self.collectionView.reloadData()

            if self.usersArray.count == 0 {
                self.noDataLabel.text = "You have no friends!"
                self.noDataLabel.isHidden = false
            } else {
                self.noDataLabel.text = "Loading..."
                self.noDataLabel.isHidden = true
            }
        })
    })
}

这会在用户的viewWillAppear 中调用

为了使这个问题尽可能清楚,刷新用户朋友的最佳方式是什么,而不需要在每次视图出现时再次获取整个列表。

【问题讨论】:

  • 您已经在使用childAdded 观察者,只有当数据库发生变化时才会返回。这是迄今为止最好的方法

标签: ios swift firebase firebase-realtime-database uicollectionview


【解决方案1】:

听起来您当前在视图消失时移除了您的观察者。届时,Firebase 将从其内存缓存中删除用户数据。因此,当您在 viewWillAppear 中重新附加侦听器时,确实需要从 Firebase 服务器重新加载数据。

如果您不希望重新加载数据,则需要确保它在设备上仍然可用。有两种选择:

  1. 确保数据保留在内存中
  2. 确保数据持久化到磁盘

确保数据留在内存中

为确保数据保留在内存中,即使在用户导航离开视图后,您也必须保持观察者的连接状态。这意味着您需要另一个类来管理观察者,当用户导航时不会删除观察者。

最简单的方法是使用一个全局单例来管理观察者和用户数据,例如UserDataManager。当您的视图首次调用此类时,创建/附加侦听器并读取用户数据。当后续视图需要用户时,他们已经加载到 UserDataManager 中以供使用。

这样做的主要问题是,当您为更多数据执行此操作时,您最终可能会在内存中保留比需要更多的数据。因此,请注意此类不需要的数据的内存消耗,并根据需要修剪(删除侦听器)。

确保数据持久化到磁盘

减少下载数据量的简单方法是在应用启动时=启用磁盘持久性](https://firebase.google.com/docs/database/ios/offline-capabilities#section-disk-persistence)。

如果启用了磁盘持久性,Firebase 客户端会将其最近观察到的数据存储到磁盘(除了将所有活动数据保留在内存中)。当您附加一个新的观察者并且数据尚未在内存中时,Firebase 将检查该数据的磁盘缓存。如果数据存在于磁盘缓存中,它会使用它来重建其内存缓存并对服务器执行更便宜(带宽方面)的检查。

【讨论】:

  • 非常感谢
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2010-10-19
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
相关资源
最近更新 更多