ios - 如何跟踪项目的当前查看者数量?

标签 ios firebase rubymotion firebase-realtime-database

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

Currently viewing

我通过在人们进入 View 时运行此事务来实现这一点(下面的 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

当他们退出 View 时:

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。

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

相关文章:

ios - 在标签中显示某个 firebase 子项的值

ios - UISearchDisplayDelegate 弃用解决方法

iphone - 从 HTML 文件链接到 View

ios - 在 RubyMotion 应用程序中实现类似 "current_user"的方法

ios - 当用户将焦点从文本字段更改为另一个时调用方法 (RubyMotion)

ios - 手动添加 Segment iOS 框架时出错

ios - Firebase:使用 swift3 访问子快照

ios - pod 未更新,即使它显示通过 'pod outdated' 可用的更新

Firebase实时数据库REST事件流: do not download the whole tree

ios - RubyMotion 未加载 AudioToolbox 框架