【发布时间】: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 化到一个角落,不得不重新构建我的数据以使其正常工作。
标签: ios objective-c arrays loops firebase