【问题标题】:How do I increase/decrease counter using FirebaseUI for Android without delay?如何立即使用 FirebaseUI for Android 增加/减少计数器?
【发布时间】:2018-08-11 17:45:49
【问题描述】:

我使用 Firebase 实时数据库和 Firebase 的云功能(使用事务)创建了类似于订阅/类似计数器的东西:

// This is a cloud function that increases subs by 1
export const onSubscriberCreate = functions.database
.ref('/channels/{$ch_id}/subscribers/{$uid}')
.onCreate((snapshot, context) => {
    const countRef = snapshot.ref.parent.parent.child('subs_count')
    return countRef.transaction(count => {
        return count + 1
    })
})

然后,我使用适用于 Android 的 FirebaseUI (FirebaseRecyclerAdapter) 来填充频道的 RecyclerView。当用户按下频道的“订阅”按钮时,他的 id 将被发送到 /channels/{$ch_id}/subscribers/ ,这会触发云功能。

但是,云功能真的很慢(大约 5 秒),所以我想在云功能执行之前“伪造”显示给用户的计数器更新(我通过更改 TextView 进行了尝试):

channelRef.child("subscribers")
    .child(user.getUid()).setValue(true)
    .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    subsInfo.setText(channel.getSubs_count() + 1) + " SUBSCRIBERS");
                }
            });

问题是频道对象被更新了两次(订阅者列表中的用户 id 和计数器增加),因此频道的信息甚至在服务器更新之前就被再次下载并绑定到 ViewHolder计数器,所以这不是一个好的解决方案。

我想过把事务代码移到客户端,真的有必要吗?有没有更好的解决方案?

【问题讨论】:

    标签: android firebase firebase-realtime-database transactions firebaseui


    【解决方案1】:

    我认为您应该做的最好的事情是将订阅者列表从频道节点内部移动到某个地方。这也将使您的频道对象重量更轻,您可以在频道节点内轻松存储/更新订阅者数量。现在,对于每个用户,每次要下载频道信息时,您都在下载整个用户列表。而且您不需要云功能来更新订阅者数量。您可以使用事务在客户端完全做到这一点。

    root/channels/{$channel}/{channelName,numberOfSubscribers,etc}
    root/subscribers/{&channel}/{$userId}
    

    这可能是您想要的数据结构,除非您真的想要获取所有用户列表。如果是这种情况,您可以在显示订阅者数量的 TextView 中显示订阅者列表的大小。

    【讨论】:

    • 感谢您的建议!它确实有助于解决这个难题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多