我如何 increase/decrease 立即针对 Android 使用 FirebaseUI 进行反击?

How do I increase/decrease counter using FirebaseUI for Android without delay?

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

// 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
    })
})

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

但是,云函数真的很慢(大约 5 秒),所以我想 "fake" 甚至在执行云函数之前就向用户显示计数器的更新(我尝试通过更改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,甚至在服务器之前更新计数器,所以这不是一个好的解决方案。

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

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

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

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