- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Firebase ,创建“房间”(例如用于聊天)很容易,正如其各种示例中所记录的那样。
对于聊天的数据结构,我会使用这样的东西:
rooms
room1
member_count
members
user1
user2
messages
message1
但现在我想对每个房间的参与者数量进行限制,例如每个聊天室 3 个用户。
你怎么能做到这一点?
在他们的文档中,看起来最有希望的一件事是使用 transactions 。你能证实这是一个好方法吗?或者这是错误的方法?
像这样的解决方案怎么样?
Firebase countRef = new Firebase("https://mychat.firebaseIO-demo.com/rooms/room1");
countRef.runTransaction(new Transaction.Handler() {
@Override
public Transaction.Result doTransaction(MutableData currentData) {
int oldMemberCount = currentData.child("member_count").getValue(Integer.class);
currentData.child("member_count").setValue(oldMemberCount + 1); // try to update member count
return Transaction.success(currentData);
}
@Override
public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) {
if (error != null || !commited) {
// rollback value (how? just do nothing?)
}
else {
// transaction has been commited (value has already been saved?)
currentData.child("members").child(CURRENT_USER_UUID).setValue(CURRENT_USER_NAME); // add user to the members list
}
}
});
如果您能对这种方法发表评论,那就太好了。此外,如果交易失败,当然不能满足这种情况。用户仍然想要加入,无论有另一个用户同时尝试加入。那么该怎么办呢?将此代码放入函数中并在错误情况下再次调用该函数?
编辑:
要创建一个具有自动唯一 ID 的新房间,当然可以使用 push()在 Firebase
引用中。
但是如果您想向该房间添加成员,则上述问题仍然存在。另一种解决方案可能是设置用户的 priority加入时在成员(member)列表中。当将它们的优先级设置为当前时间戳时,可以 limit成员列表回调到3(成员)。但这似乎既不优雅也不干净。
最佳答案
如果每个房间的参与者数量固定(且相对较少),最好使用交易。但是,最好为聊天室中的每个人创建名称正确的对象,例如:
/rooms
/<roomid, generated by push()>
/users
one: null
two: null
three: null
加入房间看起来像(JavaScript 代码,请根据需要转换为 Java);
var userid = "myuserid";
var ref = new Firebase("<my-firebase>.firebaseio.com/rooms/<roomid>/users");
ref.transaction(function(users) {
if (!users.one) {
// Claim slot 1
users.one = userid;
return users;
} else if (!users.two) {
// Claim slot 2
users.two = userid;
return users;
} else if (!users.three) {
// Claim slot 3
users.three = userid;
return users;
}
// Room is full, abort the transaction.
return;
}, function(err, committed, snapshot) {
if (committed && !err) {
// Joined room successfully.
} else {
// Could not join room because it was full.
}
});
如果 Firebase 未能将值提交到服务器,它将自动调用事务函数。除了上面的代码之外,您还需要实现一些安全规则,以防止用户声明已占用的插槽:
{
"rules": {
"rooms": {
"$roomid": {
"users": {
"$slot": {
".write": "!data.exists()"
}
}
}
}
}
}
您可以通过 Firebase 的图形调试器 Forge 上传这些规则,然后就可以开始了!
关于java - 参与者数量有限的 Firebase 房间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18268518/
我需要并行处理多个数据值(“SIMD”)。我可以使用 java.util.concurrent API (Executors.newFixedThreadPool()) 使用 Future 实例并行处
说未引用的参与者仍然订阅事件流是否正确?至少,这是我从 Akka 实验中得到的…… 我正在尝试在 EventBus 场景中为参与者实现弱引用。在这些情况下,事件监听器/参与者通常来来去去。与应该一直在
场景:我有这个代码: class MyActor extends Actor { def act() { react { case Message() => printl
我正在尝试对一条新闻帖子进行建模,其中包含有关发布该新闻的用户的信息。我认为最好的方法是发送用户摘要信息以及创建新闻帖子的消息,但我有点困惑如果底层用户信息发生变化如何更新该摘要信息。现在我有以下 N
开始学习Actor模型(使用Akka.net),打算在现在的项目中使用。我当前的任务是使用 IFilter 从不同的文件中提取文本。 IFilter 是一组带有 native 代码的 COM 服务器。
我在我的 Linux 服务器上安装了 openfire(版本:Openfire 3.9.3)。它在 2 天前工作正常,具有所有功能。我专注于存档消息插件。什么是问题: 1.当我开始与用户聊天时,它显示
感谢阅读这个问题。我有一个包含 5 个参与者的数据集,其中 10 个参与者有 8 个变量。我需要将数据集的每个参与者/行导出到一个单独的 pdf 文件中,并根据参与者名称为导出的 pdf 文件命名。附
在 Twilio REST API 中,是否可以检索已完成 session 的参与者列表?我试图在 session 结束时计算每个参与者的通话时长。我在 session 创建时传递了一个“ Actio
当使用 LDAP 存储实现 RBAC 模型时(我使用 Apache Directory 1.0.2 作为测试平台),一些参与者显然可以映射到特定的对象类: 资源 - 我没有看到此资源的清晰映射。 ap
我需要将数千个不同格式的 ms office 文档转换为一种通用格式。为了加快速度,我会使用 akka.net 将其并行化。 WordSaveAsActor 应该: 在单线程单元中运行 持有 Word
现在我们的 ASF 集群正在运行: Web API 项目 - 无状态且面向公众 Actor 项目 - 主要是 volatile 的,将数据保存在内存中,由某些 API 使用 我们正在试用 Applic
我在 R 中有一个 data.frame,其中一列指示实验中的参与者 subject,另一列指示 condition、trial_type 和最后一列,我的数字因变量 rt. 这是我使用 dput()
APARAPI project self 描述为: Aparapi allows Java developers to take advantage of the compute power of G
我正在使用 Vidyo.io 服务将视频 session 集成到我的 Android 应用程序中。我已经能够使用 android-vidyo-sdk 附带的 VidyoConnector 示例应用程序
只是一个小介绍: 有任务(任务表) 有用户(用户表) 用户可以参与不同的任务(task_has_user表) 参与者分为作者、实现者、检查者等。 我想获取以逗号分隔的参与者的所有任务列表,如下所示(数
我正在尝试实现 JUnit 测试来测试参与者。 我有这个 ActorTest : import org.junit.Test; import play.libs.Akka; import playte
我是一名优秀的程序员,十分优秀!