- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序使用包含 100,000 个项目的 Firebase 数据库。我的应用程序必须处理这些项目中的每一项,这需要几秒钟的时间。发生的情况是,每次启动应用程序(从终止状态)时,每次都会处理这 100,000 个项目(即使 Firebase 服务器上的数据库内容没有改变)。显然,如果没有必要,我不希望应用程序执行此操作。这是一些代码:
if dbRef == nil {
FirebaseApp.configure();
Database.database().isPersistenceEnabled = true
...
let dbRef = Database.database().reference(withPath: kFirebaseDBName)
_ = spamRef.observe(DataEventType.value, with: { (theSnapshot) in
if let content = theSnapshot.value as? [String : AnyObject]
{
self.processContent(content: content)
}
每次启动应用程序时,内容快照都会包含整个数据库引用内容。
有没有办法,例如,获取数据库更新的最后日期(在服务器上),或者只获取每次应用程序启动之间更改项目的增量 - 例如,查询可以返回自上次查询以来刚刚更改的内容吗,或类似的东西?
我不知道有多少项目发生了变化,所以不能这样调用:queryLimited(toLast:N))因为我不知道 N 的值是多少。
我试过如下添加 keepSynced,希望它能改变一些事情,但没有。
if dbRef == nil {
FirebaseApp.configure();
Database.database().isPersistenceEnabled = true
...
let dbRef = Database.database().reference(withPath: kFirebaseDBName)
dbRef.keepSynced(true)
_ = dbRef.observe(DataEventType.value, with: { (theSnapshot) in
if let content = theSnapshot.value as? [String : AnyObject]
{
self.processContent(content: content)
}
我不知道有多少数据可能发生了变化,所以不知道要为 toLast 或类似的东西提供什么值来修改观察参数。数据库(不是我创建的,也不是我用新内容更新的)在平面结构中有 100,000 个项目(即一个 parent 有 100,000 个 child ),自从上次我的应用程序以来,这些 child 中的任何数量的任何顺序都可能已被删除和替换跑了,但总数仍然是 100,000。没有一个 child 有明确的时间戳或类似的东西。
我的印象是,如果 Firebase 保留数据的本地缓存(由于 isPersistenceEnabled),那么下次它连接到服务器时,它只会同步服务器上发生的更改。因此,为了做到这一点,Firebase 本身必须在内部某处有一些增量信息,所以我希望增量信息可以某种形式提供给我的应用程序。
注意:我的应用程序不需要启用持久性,上面的代码这样做只是为了查看是否有任何东西会导致我希望观察者的行为。
最佳答案
更新
所以看着 documentation更多您可以设置用户最后一次连接到服务器的时间戳:
lastOnlineRef.onDisconnectSetValue(ServerValue.timestamp())
看看this question弗兰克解释了一些与坚持和听众有关的问题。问题是针对 Android 的,但原理是相同的。
我仍然认为问题出在您的查询上。由于您已经保留了数据,.value
不是您想要的,因为这会返回所有数据。
我认为您想将 .childChanged
监听器附加到您的查询。在这种情况下,查询将只返回已更改的数据。如果您在阅读之前还没有听说过 .childChanged
here .
我没有意识到这个问题与持久性特别相关。我认为您正在寻找 keepSynced()
。看看this .
原始答案
问题出在您的查询上。您正在请求所有数据,这就是您获取所有数据的原因。您想使用 toFirst or toLast 来限制您的查询.此外,我认为您不能查询上次更新数据库的时间。如果保存了时间戳,则可以检查数据结构中的最后一个节点,但也可以只获取最新数据。
你想要这样的东西:
ref.child("yourChild").queryLimited(toLast: 7).observeSingleEvent(of: .value, with: { snap in
// do something
})
根据您编写数据的方式,您需要 toLast
或 toFirst
。假设最新的数据是最后写入的 toLast
就是你想要的。另请注意,我限制的数字是任意的,您可以使用适合您的项目的任何数字。
如果你已经有了一个键并且你想在那个键之上开始查询你可以这样做:
ref.child("YourChild").queryOrderedByKey().queryEnding(atValue: lastVisiblePostKey).queryLimited(toLast: 8).observeSingleEvent(of: .value, with: { snap in
// do something with more posts
})
您可能还想查看 this question , this question和 pagination .
关于ios - Firebase:下次应用程序启动时如何只检索更改的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48086657/
如果我使用下面的代码,数据将为零 dispatch_async(dispatch_get_global_queue(0,0), ^{ UIImage *img = [[UIImage allo
fread来自 data.table包一般可以在读取文件时自动确定列分隔符( sep )。 例如,这里fread自动检测 |作为列分隔符: library(data.table) fread(past
因此,如果我有一个如下所示的数据框: A B C rowname1 4.5 4 3.2 rowname2 3 23
我有一个汽车模型的搜索数据库:“日产Gtr”,“Huynday Elantra”,“Honda Accord”等。 现在我还有一个用户列表和他们喜欢的汽车类型 user1喜欢:carId:1234,c
我正在使用 Javamail 来获取一些电子邮件数据。我将用户输入作为电子邮件 ID、imap 地址和密码并连接到 imap。然后我监视收件箱的电子邮件并查明此人是否在“收件人”或“抄送”中。 Ema
我有一些数据,我想根据差距统计来评估最佳簇数。 我阅读了 gap statistic 上的页面在 r 中给出了以下示例: gs.pam.RU Number of clusters (method '
我有一个用户名和密码组合,我将使用它通过 java 代码访问安全服务器。 我的想法是: 在外部存储加密凭据 执行时提示用户输入解密密码 在使用前将解密的凭据直接存储在字符数组中 使用凭据连接到数据库
这是 Firebase 数据:[Firebase 数据][1] 我必须从员工那里检索所有字段并将其存储在一个数组中。 现在数据更改 toast 消息即将到来,但已经很晚了。 Firebase.setA
我是 iOS 的新手,正在开发一个基本的应用程序,它目前正在使用 SSKeychain 和 AFNetworking 与 API 进行交互。当您使用我检索的应用程序登录并在我的 CredentialS
编辑:这个问题已经在 apphacker 和 ConcernedOfTunbridgeWells 的帮助下得到解决。我已更新代码以反射(reflect)我将使用的解决方案。 我目前正在编写一个群体智能
我是 C 的新手,我想编写一个程序来检查用户输入的单词是否合法。我已经在 stackoverflow 上搜索了建议,但很多都是针对特定情况的。请在我被激怒之前,我知道这个语法不正确,但正在寻找一些关于
我相信你们中的一些人编写过 C# 类,这些类必须从数据库设置密码/从数据库获取密码。 我假设敏感细节不会以明文形式显示。处理此类数据的推荐程序是什么?检索到的文本是否加密?您是否将 pws 存储在加密
我在 linux 上使用 2.7 之前的 python 版本,想知道如何检索 RUID? 2.7 及更高版本从 os 包中获得了 getresuid,但我似乎找不到 2.6 的等效项 最佳答案 您可以
我已经在 Android 中实现了一个存储对象的标准 LRUCache。每个键都是与存储的对象关联的唯一 ObjectId。我的问题是从缓存中检索对象的唯一方法是通过 ObjectId(无迭代器)。实
这已经被问过很多次了。解决方案(对我有用)是从 packages.config 文件(这就足够了)和 packages 文件夹中删除 *** 包。 这对我来说是一个糟糕的解决方案,因为每次我想安装一些
我有以下文字: #{king} for a ##{day}, ##{fool} for a #{lifetime} 以及以下(损坏的)正则表达式: [^#]#{[a-z]+} 我想匹配所有#{word
我正在寻找一种快速(如高性能,而不是快速修复)解决方案来持久化和检索数千万个小型(大约 1k)二进制对象。每个对象都应该有一个用于检索的唯一 ID(最好是 GUID 或 SHA)。额外的要求是它应该可
有没有办法获取 RegInit 的重置值?通过探测产生的类型的成员?我可以看到 RegInit 将返回类型(例如 UInt )。例如,我将有一个寄存器,我想通过 regmap 对其进行控制。 val
Iv 目前接手了一个项目,其中开发人员在某些表的 json 数组列中存储了 has many 关系。 产品表 ---------------------------- id | product | c
Git 会在任何地方记录推送到远程的历史吗? 我注意到我们能够在 Microsoft VSTS 中查看 Git 存储库的推送历史记录以及每次推送的相关提交。它甚至显示旧的、过时的提交,由于后来的强制推
我是一名优秀的程序员,十分优秀!