我有一个评论屏幕,其中包含评论列表和底部的文本框。我有两种方法可以使用更新的评论计数保存评论:
1)使用set()
ref.child(commentsList).child(commentKey).set(true);
ref.child(commentsCount).set(++count);
2)使用update()
allCommentKeysArray[newCommentsKey] == true
var data = {
commentscount: ++count,
commentslist: { ...allCommentKeysArray}
}
ref.child(path).update(data);
现在,对于离线情况,即客户端从互联网断开连接,如果我在离线时添加多个评论,这两种情况都会发生:
set()工作正常。当客户端返回在线模式时,用户在离线时添加的所有注释都将保存到firebase数据库。
但是离线时update()似乎不起作用。当客户返回在线模式时,'计算'值不正确,只有一个键被添加到' commentsList' firebase数据库中的节点。
我想使用update()而不是set(),但update()似乎不适用于离线模式。那么,我应该坚持使用set(),因为我需要实现离线功能,还是有更好的方法?
答案 0 :(得分:3)
update()
方法在技术上可行。它根本不能做你想做的事。 : - )
离线方案现在发生的是:
问题在于另一个客户端可能也在#4之前添加了评论,而您的客户端从未正确更新评论计数。
有很多方法可以解决这个问题,但很多方法很快变得非常复杂。迄今为止最简单的两个是:
commentscount
中的更改与操作的实际注释中的更改匹配时,才允许客户端发送的更新。这非常复杂,但具有在客户端离线时可以正常工作的优势。在上面的场景中,结果将是服务器拒绝写入,然后您的客户端可以从步骤2重试(在使用服务器中的正确值更新注释计数之后)。如果您想调查此路径,则类似于我在此处的回答中所示:https://stackoverflow.com/a/37956590