Firebase 查询未按调用顺序触发

Posted

技术标签:

【中文标题】Firebase 查询未按调用顺序触发【英文标题】:Firebase Queries Not Firing in Order that they were called 【发布时间】:2016-05-02 16:53:44 【问题描述】:

我在 for 循环中调用 Firebase 查询。但是,Firebase 查询不会按照它们被调用的顺序触发。代码如下:

NSLog(@"%@", self.orderedKeys.description);

for (NSInteger i = 0; i < self.orderedKeys.count; i++) 
        [[selectedLanguageRef childByAppendingPath:self.orderedKeys[i]] observeSingleEventOfType:FEventTypeValue withBlock:^(FDataSnapshot *userSnapshot)              
            NSLog(@"%@", self.orderedKeys.description);
            NSLog(@"%@", userSnapshot.key);
        ];

在这段代码中,NSLog 返回 self.orderedKeys.description

fakeUser8, fakeUser7, “facebook:10205598530457903”,fakeUser3,fakeUser10,fakeUser9,fakeUser14,fakeUser13

userSnapshot.key 的 NSLog 将始终按此顺序触发:

fakeUser3、fakeUser10、facebook:10205598530457903、fakeUser8、fakeUser7、fakeUser14、fakeUser13、fakeUser9

这里发生了什么?如何让查询按照它们被调用的顺序触发?

【问题讨论】:

不!不要这样做! Firebase 以异步方式工作,您应该等待一个操作的结果,然后再采取下一个操作。我们可以提供一些方向,但需要知道您的预期结果是什么,以及您的 Firebase 结构的 sn-p(请作为文本,Firebase Dashboard->Export)。如果您必须执行一系列查询,则结构可能存在问题,导致您必须这样做。 @Jay 你能澄清一下我不应该做什么吗?感谢您的反馈 Firebase 是异步的,您的代码可能会覆盖返回的值,或者由于滞后,这些值可能会以意外的顺序返回。例如,假设您的第一个查询触发并且返回该查询有延迟,但第二个查询更快地返回数据。返回的数据不像您的代码那样同步,因此您需要在继续之前处理返回的数据。可能(应该)避免多个这样的查询,所以发布你的结构和意图,让我们看看。 @Jay 感谢您提供帮助我重组。如果我必须重组,我会自己解决。我希望有一个快速修复,或者按调用顺序从 Firebase 取回数据的方法,但如果没有,我会看看我能做什么。以前有人问过这个吗?人们通常会做什么而不是循环浏览一长串电话? 这是一个非常好的问题;一般来说,Firebase 需要按照您将要使用的方式进行构建;预先规划查询、分解将被观察的节点、非规范化数据、考虑它的异步性质以及规划规则是需要预先完成的事情。相信我,我已经多次将自己 JSON 化到一个角落,不得不重新构建我的数据以使其正常工作。 【参考方案1】:

Firebase 是异步的,您的代码可能会覆盖返回的值,或者由于滞后,这些值可能会以意外的顺序返回。

例如,您的第一个查询触发并且返回该查询有延迟,但第二个查询返回数据的速度更快。返回的数据不像代码那样同步,所以你需要在继续之前处理返回的数据。

一般来说,Firebase 需要按照您将要使用的方式进行结构化;预先规划查询、分解将被观察的节点、非规范化数据、考虑其异步性质以及规划规则是需要预先完成的事情。

【讨论】:

【参考方案2】:

我没有专门使用 Firebase,但同时运行多个异步调用似乎是个问题。您可以使用串行队列来确保一次只运行一个。

https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW6

【讨论】:

以上是关于Firebase 查询未按调用顺序触发的主要内容,如果未能解决你的问题,请参考以下文章

Firebase iOS 查询未按预期排序

wcf 调用完成事件未按正确顺序触发

Firebase云功能Firestore触发onWrite在本地测试时未按预期运行

ViewDidLoad 未按正确顺序执行操作 - Firebase、Swift

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

气流动态生成的任务未按顺序运行