我有一个iPhone应用程序,我想要显示当前有多少人正在查看项目:
我是通过在人们进入视图时运行此事务来做到这一点(下面的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”。
如何确保列表中的查看量无论如何都会减少?
答案 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。