【发布时间】: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