如何跟踪项目的当前观看者数量?

时间:2016-05-24 02:04:32

标签: ios firebase rubymotion firebase-realtime-database

我有一个iPhone应用程序,我想要显示当前有多少人正在查看项目:

Currently viewing

我是通过在人们进入视图时运行此事务来做到这一点(下面的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”。

如何确保列表中的查看量无论如何都会减少?

1 个答案:

答案 0 :(得分:1)

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。

相关问题