ios - 从 Firebase 获取数据的最有效方式

标签 ios swift firebase firebase-realtime-database uicollectionview

我正在获取当前用户的 friend 并将用户存储在一个数组中,该数组显示在 Collection View 中。 friend Collection View 在我的主视图 Controller 上,这意味着它始终保留在用户堆栈中

我的问题是,如果用户通过用户个人资料页面添加或删除 friend ,然后导航回主页 View ,我必须重新获取数据并刷新 中的 Collection View 查看将出现。这使得应用程序的数据成本很高,我绝对觉得这不是最有效的方法。

我知道 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 中调用

为了让这个问题尽可能清楚,什么是最好的方式来刷新用户的 friend ,而不需要每次出现 View 时都重新获取整个列表。

最佳答案

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

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

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

确保数据保留在内存中

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

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

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

确保数据持久化到磁盘

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

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

关于ios - 从 Firebase 获取数据的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48720461/

相关文章:

ios - UI 测试中 Collection View 的错误单元格计数

ios - UICollectionView 不要求从 UICollectionViewDataSource 获取数据

javascript - 在 React Native 中将数据从子组件传递到父组件?

ios - 使用SWIFT在iOS SDK for Facebook上使用FBSDKGraphRequest

ios - 如何从 firebase 检索当前用户的数据

swift - 快速检索子键并显示在标签中

ios google登录,如何获取用户图片网址?

ios - 如何使用 Reachability 的不同实现来解决不同的 CocoaPods?

ios - 如何在 iOS 13 中调暗状态栏

ios - 将 Swift 添加到项目中会显着增加大小。如何以及何时可以避免