- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在获取当前用户的 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 服务器重新加载数据。
如果您不希望重新加载数据,则需要确保它在设备上仍然可用。有两种选择:
为确保数据保留在内存中,即使在用户导航离开 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/
我遇到了一个奇怪的问题。我有这个: $(document).ready(function () {
我正在编写一个程序,它从列表中读取一些 ID,从中找出不同的 URL,然后将图像保存到我的 C: 驱动器中。 如果我在浏览器中导航到图像 URL,它们就会起作用。此外,如果我尝试从不同的服务器获取图像
我编写了一个 REST WCF RIA Silverlight 4.0 兼容服务,我可以从 javascript + jQuery.1.4.2.js + JSON2.js(当然,还可以从 .NET 4
我很确定这个网站实际上还没有得到回答。一劳永逸地,与 32 位有符号整数范围内的数字字符串匹配的最小正则表达式是什么,范围是 -2147483648至 2147483647 . 我必须使用正则表达式进
我有两个data.table;我想从那些与键匹配的元素中随机分配一个元素。我现在这样做的方式相当慢。 让我们具体点;这是一些示例数据: dt1<-data.table(id=sample(letter
我已经安装了 celery 、RabitMQ 和花。我可以浏览到花港。我有以下简单的工作人员,我可以将其附加到 celery 并从 python 程序调用: # -*- coding: utf-8 -
我正在使用 ScalaCheck 在 ScalaTest 中进行一些基于属性的测试。假设我想测试一个函数,f(x: Double): Double仅针对 x >= 0.0 定义的, 并返回 NaN对于
我想检查文件是否具有有效的 IMAGE_DOS_SIGNATURE (MZ) function isMZ(FileName : String) : boolean; var Signature: W
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我在工作中查看了一些代码,发现了一些我以前没有遇到过的东西: for (; ;) { // Some code here break; } 我们一直调用包含这个的函数,我最近才进去看看它是
在 Herbert Schildt 的“Java:完整引用,第 9 版”中,有一个让我有点困惑的例子。它的关键点我无法理解可以概括为以下代码: class Test { public stat
我试图编写一个函数,获取 2D 点矩阵和概率 p 并以概率 p 更改或交换每个点坐标 所以我问了一个question我试图使用二进制序列作为特定矩阵 swap_matrix=[[0,1],[1,0]]
这个问题在这里已经有了答案: Using / or \\ for folder paths in C# (5 个答案) 关闭 7 年前。 我在某个Class1中有这个功能: public v
PostgreSQL 10.4 我有一张 table : Column | Type ------------------------- id | integer| title
我正在 Postgresql 中编写一个函数,它将返回一些针对特定时区(输入)计算的指标。 示例结果: 主要问题是这只是一个指标。我需要从其他表中获取其他 9 个指标。 对于实现此目标的更简洁的方法有
我需要在 python 中模拟超几何分布(用于不替换采样元素的花哨词)。 设置:有一个装满人口许多弹珠的袋子。弹珠有两种类型,红色和绿色(在以下实现中,弹珠表示为 True 和 False)。从袋子中
我正在使用 MaterializeCSS 框架并动态填充文本输入。我遇到的一个问题是,在我关注该字段之前,valid 和 invalid css 类不会添加到我的字段中。 即使我调用 M.update
是否有重叠 2 个 div 的有效方法。 我有以下内容,但无法让它们重叠。 #top-border{width:100%; height:60px; background:url(image.jpg)
我希望你们中的一位能向我解释为什么编译器要求我在编译单元中重新定义一个静态固定长度数组,尽管我已经在头文件中这样做了。这是一个例子: 我的类.h: #ifndef MYCLASS_H #define
我正在使用旧线程发布试图解决相同问题的新代码。什么是安全 pickle ? this? socks .py from socket import socket from socket import A
我是一名优秀的程序员,十分优秀!