Firebase查询未按顺序触发它们被调用

时间:2016-05-02 16:53:44

标签: ios objective-c arrays loops firebase

我在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

这里发生了什么?如何以与他们调用的顺序相同的方式触发查询?

2 个答案:

答案 0 :(得分:2)

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

例如,假设您的第一个查询触发并且返回该延迟,但第二个查询更快地返回数据。返回的数据与代码不同步,因此您需要在继续之前处理返回的数据。

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

答案 1 :(得分:0)

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

"Inheritance" section