首页 文章

Firebase - 为脱机情况设置vs更新?

提问于
浏览
4

我有一个评论屏幕,其中包含评论列表和底部的文本框 . 我有两种方法可以使用更新的注释计数保存注释:

1) Using set()

ref.child(commentsList).child(commentKey).set(true);
ref.child(commentsCount).set(++count);

2) Using update()

allCommentKeysArray[newCommentsKey] == true
var data = {
        commentscount: ++count,
        commentslist: { ...allCommentKeysArray}
    }
ref.child(path).update(data);

现在,对于离线情况,即客户端从互联网断开连接,如果我在离线时添加多个评论,这两种情况都会发生以下情况:

set()工作正常 . 当客户端返回在线模式时,用户在离线时添加的所有注释都将保存到firebase数据库 .

但是离线时update()似乎不起作用 . 当客户端返回在线模式时,“计数”值不正确,并且只有一个密钥被添加到firebase数据库中的“commentsList”节点 .

我想使用update()而不是set(),但update()似乎不适用于离线模式 . 那么,我应该坚持使用set(),因为我需要实现离线功能,还是有更好的方法?

1 回答

  • 3

    update() 方法在技术上工作正常 . 它只是没有做你想做的事 . :-)

    现在离线场景中发生的事情是:

    • 离线客户端添加注释

    • 离线客户端更新自己的评论计数

    • 客户回来了

    • 客户端将其新注释及其自己的注释计数发送到服务器

    这个问题是另一个客户端也可能在#4之前添加了注释,并且您的客户端从未正确更新注释计数 .

    有很多方法可以解决这个问题,但很多方法很快变得非常复杂 . 到目前为止最简单的两个是:

    • 使用事务来添加评论和计数(正如Doug在评论中所建议的那样) . 这是最简单的解决方案,但在客户端脱机时不起作用 .

    • 使用 Cloud 功能递增计数器,如functions-samples repo所示 . 但是,因为 Cloud 功能在Google上运行's servers, this too won' t离线工作 .

    • 使用Firebase的服务器端安全规则来验证客户端发送的更新是否仅在 commentscount 中的更改与操作的实际注释中的更改匹配时才被允许 . 这是相当复杂的,但有一个优点,它想调查这条路径,它类似于我在这里回答的那些:https://stackoverflow.com/a/37956590

相关问题