【问题标题】:Firebase Offline, determine if items were saved to server and not just local cacheFirebase 离线,确定项目是否保存到服务器而不仅仅是本地缓存
【发布时间】:2017-02-07 06:49:53
【问题描述】:

我有一个消息传递应用程序,我正在离线使用 firebase,当我更新子值时,它会先转到本地缓存,然后再转到服务器。但是,当我关闭互联网时,它只会进入本地缓存,如果我关闭应用程序,数据就会丢失。

有没有办法确定是否将某些内容保存到服务器而不是本地缓存?

如果没有,确定某些内容是否成功发送到服务器的最有效方法是什么。

我尝试了一个观察值,但它也观察离线更新。

【问题讨论】:

  • 您需要附加一个完成侦听器来检测写入何时提交到数据库服务器。您在为哪个平台编写代码?
  • 您好,我正在 swift 上编码,我正在离线使用 firebase。当我离线连接firebase时,我永远无法检测它是否保存在服务器上。抱歉回复晚了。
  • 因为它会自动保存在离线缓存中,并且从中触发了childadd,但是我需要一种方法来知道它是否成功到达在线数据库,谢谢您的帮助
  • 只有在数据写入服务器时才会触发完成侦听器。在此处查看示例:stackoverflow.com/documentation/firebase/5548/…。但是,如果在写入操作和提交到服务器之间有一个应用程序重新启动,则不会触发该回调。目前没有解决方法。
  • 成功了,谢谢,您可以随时将其作为答案!

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


【解决方案1】:

仅当数据写入服务器时才会触发完成侦听器。看一个例子:

let message = ["name": "puf", "text": "Hello from iOS"]
ref!.childByAutoId().setValue(message) { (error) in
    print("Error while writing message \(error)")
}

但如果在写入操作和提交到服务器之间有应用重启,则不会触发该回调。目前没有解决方法。

【讨论】:

【解决方案2】:

我也遇到了同样的问题,可以使用云功能解决。基本上,只需创建一个在创建消息时调用的云函数,并将此消息的“持久”字段设置为 true。它将传播给您的客户端,客户端会将没有“持久”属性的任何消息视为尚未发送的消息。

exports.confirmMessageSave = functions.database
  .ref('/chat/messages/{channelId}/{messageId}')
  .onCreate(function(event) {

    var message = event.data.val();

    var updateFanOut = {};
    updateFanOut['/messages/' + event.params.channelId + '/' + event.params.messageId + '/persisted'] = true;
    return admin.database().ref('/chat').update(updateFanOut);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 2020-08-18
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多