我有一个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”。
无论如何,如何确保清单上的观看量递减?
最佳答案
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/