我在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, &#34; facebook:10205598530457903&#34;,fakeUser3,fakeUser10,fakeUser9,fakeUser14,fakeUser13
但userSnapshot.key
的NSLog将始终按此顺序触发:
fakeUser3,fakeUser10,facebook:10205598530457903,fakeUser8,fakeUser7,fakeUser14,fakeUser13,fakeUser9
这里发生了什么?如何以与他们调用的顺序相同的方式触发查询?
答案 0 :(得分:2)
Firebase是异步的,您的代码可能会覆盖返回的值,或者由于延迟,值可能会以意外的顺序返回。
例如,假设您的第一个查询触发并且返回该延迟,但第二个查询更快地返回数据。返回的数据与代码不同步,因此您需要在继续之前处理返回的数据。
一般而言,Firebase需要按照您使用它的方式进行构建;预先规划查询,分解将要观察的节点,对数据进行非规范化,考虑它的异步性以及规划规则是需要预先完成的事情。
答案 1 :(得分:0)
我还没有专门使用Firebase,但同时运行多个异步调用似乎是一个问题。您可以使用串行队列来确保一次只运行一个。