2016-05-02 38 views
0

私はforループ内でFirebaseクエリを呼び出しています。しかし、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は​​のためにこれを返します。

fakeUser8、fakeUser7、 "フェイスブック:10205598530457903"、fakeUser3、fakeUser10、fakeUser9、fakeUser14、fakeUser13

しかしuserSnapshot.keyのためのNSLogは、常にこの順序で起動します:

fakeUser3、fakeUser10、Facebookの:10205598530457903、fakeUser8、fakeUser7、fakeUser14、fakeUser13、fakeUser9

ここでは何が起こっていますか?クエリを呼び出した順序と同じ順序で呼び出すにはどうすればよいですか?

+0

NO!これをしないでください! Firebaseは非同期で動作し、次のアクションを実行する前に、あるアクションの結果を待つ必要があります。私たちは何らかの方向性を提供することができますが、期待される結果が何であるかを知る必要があります。また、Firebase構造のスニペット(テキストとして、Firebase Dashboard-> Export)を入力してください。また、一連のクエリを実行する必要がある場合は、構造体に問題があるため、それを行わなければならない場合があります。 – Jay

+0

@Jay私はやっていないことを明確にすることができますか?フィードバックありがとう –

+0

Firebaseが非同期で、コードが返された値を上書きしている可能性があります。また、値が遅れて予期しない順序で返ってきている可能性があります。たとえば、最初のクエリが実行され、それを返す遅延がありますが、2番目のクエリはデータをより速く返します。返されたデータはコードのように同期していないので、移動する前に返されたデータを処理する必要があります。そのような複数のクエリはおそらく避けなければならないので、構造と意図を投稿して見てみましょう。 – Jay

答えて

2

Firebaseは非同期であり、あなたのコードが返された値を上書きすることができるか、値が遅れに起因する予期しないために帰国することができます。

たとえば、最初のクエリが発生し、それを返す遅延がありますが、2番目のクエリはデータをより速く返します。返されるデータはコードのように同期していないので、移動する前に返されたデータを処理する必要があります。

一般に、Firebaseは使用する方法で構造化する必要があります。データの非正規化、ルールの計画だけでなく非同期性の考慮も前もって準備する必要があります。

関連する問題