Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 如何确保在ChildAdded事件侦听器中有序地处理子级?_Firebase_Unity3d_Firebase Realtime Database - Fatal编程技术网

Firebase 如何确保在ChildAdded事件侦听器中有序地处理子级?

Firebase 如何确保在ChildAdded事件侦听器中有序地处理子级?,firebase,unity3d,firebase-realtime-database,Firebase,Unity3d,Firebase Realtime Database,我需要确保添加到数据库引用的子项按顺序处理。添加子级的分支可能一次添加多个子级。当孩子们以很小的间隔加入时,一切都很顺利 为了解决这个问题,我已经实现了一个基于索引的解决方案。我在每个子项中添加一个字段“index”,并确保云函数(添加这些子项的代码)中的所有子项的索引都是增量的。然后,我执行以下操作来实现它: MyDatabaseReference.OrderByChild("index").ChildAdded += HandleTheChild; 大多数情况下,这是可行的,但仍有一些时候

我需要确保添加到数据库引用的子项按顺序处理。添加子级的分支可能一次添加多个子级。当孩子们以很小的间隔加入时,一切都很顺利

为了解决这个问题,我已经实现了一个基于索引的解决方案。我在每个子项中添加一个字段“index”,并确保云函数(添加这些子项的代码)中的所有子项的索引都是增量的。然后,我执行以下操作来实现它:

MyDatabaseReference.OrderByChild("index").ChildAdded += HandleTheChild;

大多数情况下,这是可行的,但仍有一些时候,我会遇到类似的错误,当我面对错误的儿童秩序错误的错误。我的假设是HandleTheChild函数总是按顺序触发的,但有可能在HandleTheChild函数完全处理前一个孩子之前就开始处理孩子。这在并行执行中创造了一些竞争条件。我希望只有在所有之前的子项都按照它们到达的顺序处理之后,才能处理每个子项。我的假设错了吗?如果没有,我是否应该继续在我的Unity客户端上实现生产者-消费者问题的解决方案?

当您第一次将侦听器附加到
ChildAdded
时,它将按照您请求的顺序为所有子代激发

之后,当一个子对象被添加到数据库中时,
ChildAdded
侦听器将激发。在这种情况下,可以将孩子插入数据中间的某个地方(例如,如果其<代码>索引>代码>低于现有索引。<代码>儿童添加< /代码>监听器将对此进行开火,并具有此情况。
我猜您没有使用
PreviousChildName
,而是(正如Doug所评论的)如果看不到该代码,很难确定。

请编辑问题以显示HandleTheChild的代码。此外,请解释您是如何观察到在HandleTheChild函数完全处理前一个孩子之前开始处理孩子的。问题的目的不是调试我的代码,而是我想知道如果我的假设是正确的。我不确定问这个问题的正确方式是什么,所以我包括了我的用例和我面临的问题。我还没有进行观察,因为错误很少出现,我仍然在进行假设,以确定我的下一步。只有在我确定这一点时,我才想进入观察和调试部分这是一个可能的问题。我正在尝试检查您的代码是否正在执行与预期不同的操作。所有操作都可能是错误源,我不确定如何在理解所有移动部分的情况下考虑它。我永远不会期望回调调用中会有任何并行性。这不是方法任何其他客户端平台都可以工作。我只是在寻找这个答案。回调调用中可能存在并行性吗?感谢您为我提供了简洁的说明。Unity+Firebase在线程处理方面带来了很多麻烦,因为Unity强制所有东西都在其主线程上运行,Firebase不遵守。这个问题应该问som吗ewhere else?如果您认为Firebase SDK没有按应有的方式工作,那么请使用Firebase支持提交一个bug。否则,在不显示代码的情况下,堆栈溢出没有什么帮助。我在问题中提到,我正在确保添加的子代只具有递增索引。我通过将索引保存在单独的b上来实现这一点ranch来维护该状态。在添加时间戳时也通过检查时间戳进行了测试,结果正如预期的那样。很明显,您所确保的工作不起作用。与其用文字描述您所做的工作,请确保您的问题包括(请阅读链接,它非常有用).没有这些,我们就无法有效地提供帮助(正如我试图回答的那样,也无法有效地提供帮助)。