【问题标题】:How can I track the current number of viewers of an item?如何跟踪项目的当前查看者数量?
【发布时间】:2016-05-24 02:04:31
【问题描述】:

我有一个 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”。

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

【问题讨论】:

    标签: ios firebase rubymotion firebase-realtime-database


    【解决方案1】:

    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();
    

    这两个代码 sn-ps 都是 JavaScript 语法,因为我只是在输入它们后才注意到您使用的是 Swift。

    【讨论】:

    • 谢谢。我怀疑类似的东西会是解决方案。你能告诉我 onDisconnect 是否是万无一失的吗?如果连接在 x 分钟前丢失,它是否充当 Firebase 服务器上的一种计时器并自动断开连接?或者,如果应用突然崩溃并且没有时间向 Firebase 发送消息,它会如何工作?
    • 还有一个问题。假设我有 10000 人在看同一个项目。然后突然间听“itemViewers”上的变化似乎相当昂贵。这是我应该在规模上担心的事情吗?只需在项目本身上收听“viewers_amount”,似乎成本要低得多。你有什么想法?
    • 如果客户端完全断开连接,它会向服务器发送一个关闭信号,并且onDisconnect() 处理程序会立即执行。如果客户端只是消失了,服务器将在套接字超时时检测到这一点(通常是几分钟,但可能会有所不同)。
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多