如何跟踪项目的当前查看者数量?
How can I track the current number of viewers of an item?
我有一个 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 数据库的情况)使用能够优雅地处理这种情况的数据模型。在您的情况下,不存储观众的 count 似乎是最自然的,而是存储每个观众的 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。
我有一个 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 数据库的情况)使用能够优雅地处理这种情况的数据模型。在您的情况下,不存储观众的 count 似乎是最自然的,而是存储每个观众的 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。