我有一个iPhone应用程序,我想在其中显示有多少人正在查看这样的项目:

ios - 如何跟踪某个项目的当前观看者数量?-LMLPHP

我通过在人们进入视图时运行此事务来做到这一点(下面的Rubymotion代码,但功能完全类似于Firebase iOS SDK):

listing_reference[:listings][self.id][:viewing_amount].transaction do |data|
  data.value = data.value.to_i + 1
  FTransactionResult.successWithValue(data)
end


当他们退出视图时:

listing_reference[:listings][self.id][:viewing_amount].transaction do |data|
  data.value = data.value.to_i + -
  FTransactionResult.successWithValue(data)
end


在大多数情况下,它都能正常工作,但有时会出错。应用程序崩溃,人们失去了连接或类似的东西。

我一直在寻找“ onDisconnect”来解决这个问题-https://firebase.google.com/docs/reference/ios/firebasedatabase/interface_f_i_r_database_reference#method-detail-但据我所知,没有“ inDisconnectRunTransaction”。

无论如何,如何确保清单上的观看量递减?

最佳答案

Firebase数据库事务作为比较并设置操作运行:给定节点的当前值,您的代码将指定新值。这要求客户端和服务器之间至少有一个往返,这意味着它本质上不适合onDisconnect()操作。

相反,onDisconnect()处理程序是一个简单的set()操作:您在连接处理程序时指定,当服务器检测到客户端已断开连接时(干净地或在遇到问题的情况下非自愿地),要进行的写操作。

解决方案是(使用NoSQL数据库通常是这种情况)使用可以优雅地处理这种情况的数据模型。在您的情况下,似乎最自然的是不存储观看者人数,而是存储每个观看者的uid

itemViewers
  $itemId
    uid_1: true
    uid_2: true
    uid_3: true


现在,您可以通过一个简单的value侦听器获得查看者的数量:

ref.child('itemViewers').child(itemId).on('value', function(snapshot) {
  console.log(snapshot.numChildren());
});


并使用以下onDisconnect()进行清理:

ref.child('itemViewers').child(itemId).child(authData.uid).remove();


这两个代码段均采用JavaScript语法,因为我只注意到键入它们后才使用Swift。

关于ios - 如何跟踪某个项目的当前观看者数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37403251/

10-09 07:33