gpt4 book ai didi

ios - Firebase中非常接近的事件的数据一致性

转载 作者:行者123 更新时间:2023-12-01 18:47:01 26 4
gpt4 key购买 nike

我正在构建一个iOS游戏。每个游戏室由两个用户构成。匹配两个用户之后,我在两个设备上都显示一个“等待响应”计时器:他们需要在8秒内单击“我准备就绪”按钮,否则他们都会被踢出房间并从Firebase中删除。

用户的正确状态(在每个用户单击“我准备就绪”按钮之前):

Parent
Matches
User 1
opponent : User2
state : "NotReady"
User 2
opponent : User1
state : "NotReady"

重要提示-两个设备上的计时器时差为+ -2秒,换句话说-一旦设备计时器要在另一个之前结束

当用户按下“我准备好”按钮时,我正在更新 state : "userReady",并检查其他用户是否也准备就绪(观察其 state值)。

如果两个用户均为 userReady -游戏开始。

问题

所以我们已经清除了,在100%的情况下,两个设备之间的时间差很小。 ,例如
User1单击了 I'm Ready按钮。因此,现在 User2有了一个 ChildUpdate事件,据他所知- User2已完全可以播放。
User1 timer首先结束(事实),因此当他的计时器结束时, User2 timer将保留 1秒。 现在,User1时间上的刚达到零,因此他被踢出了房间,并在每个“用户”节点上发送了 removeValue事件。发生这种情况时,在一个很小的“间隙”(在 User1 timer结束的零时间, User2时钟显示的1秒(事实)之间-他 按下的“就绪”按钮。他认为 User1已准备就绪,他也是如此-比游戏开始比赛。

最终结果-

两名玩家均已从Firebase中删除

用户1不在房间里

User2开始游戏(他认为自己是对手)

如何解决这种最终情况? ,我已经尝试过仅在“UpdateChild状态”完成时调用 startGame函数,但是它仍然存在,也许是因为updateChild,and removeValue的顺序?

有什么建议吗? BIG非常感谢Firebase团队一直以来的努力!!!

最佳答案

无论如何,用户1都不会接受然后过期就没有意义了。如果达到了时间限制并且尚未接受,则用户2应该是即将到期的用户。

为了防止这种情况,您正在寻找transactions。当您要“使”用户“过期”时,请使用事务来执行此操作,这样就不会出现数据冲突。

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/");

ref.child('Parent/Matches').child(user1).transaction(function(currentValue) {
if( currentValue && currentValue.state === 'NotReady' ) {
return null; // delete the user
}
else {
return undefined; // abort the transaction; status changed while we were attempting to remove it
}
});

可能迅速纠正:
var ref = Firebase(url: "https://<YOUR-FIREBASE-APP>.firebaseio.com/Parent/Matches/<user id>")

upvotesRef.runTransactionBlock({
(currentData:FMutableData!) in
if currentData && currentData.value["state"] != "NotReady" {
return FTransactionResult.successWithValue(NSNull)
}
return FTransactionResult.abort();
});

此外,您可以通过在两个用户都达到其接受时间限制之前不删除/过期记录,然后一次在事务中同时执行两个操作,来简化事情并减少混乱的机会。

关于ios - Firebase中非常接近的事件的数据一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34778914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com