1

Firebase はベースから読み取るときに順序を保証しないため、この非同期呼び出しから順序付けられていない出力を取得できます。

-(void)loadDataFromFirebase
{
    handles = [[NSMutableArray alloc] init];
    Firebase* listRef = [[Firebase alloc] initWithUrl:@"https://mobilefeast.firebaseIO.com/foodtrucks"];
    [listRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
        NSLog(@"%@", snapshot.name);
        [handles addObject:snapshot.value];
        [self.handleTableView reloadData];
    }];
}

Firebase からのスニペットの順序付けされた読み取りの例では、非同期データの出力を順序付けできますが、これは iOS の NSArrays ではうまく機能しません。iOSのFirebaseから順番に配列を設定する正しい方法は何ですか? これは、REST 呼び出しの URL の末尾に .json を追加することで実現できると思いますが、ネイティブの Firebase iOS API に固執したいと考えています。ありがとう。

*編集: *単純なアルファベット順のソートを探しています。これは Rest で発生するように見え、REST で次の URL を使用すると発生します。

https://mobilefeast.firebaseio.com/foodtrucks/.json

しかし、iOS Firebase API で同じ順序を複製することはできないようです。

4

1 に答える 1

3

この特定の例では、Firebase の非同期の性質が原因で、イベントが一見順不同でトリガーされているわけではありません。舞台裏では、すべてのデータをディクショナリ (配列も含む) として保持しています (理論的根拠については、こちらを参照してください: https://www.firebase.com/docs/managing-lists.html )。サンプル コードはFEventTypeChildAddedイベント タイプを使用しているため、コールバックはキー (この場合は 0、1、2、3、...、12、13、14...) に基づいて辞書式にトリガーされ、結果は次のようになります。あなたが見ている出力で。Firebase イベントで順序付けが役割を果たすさまざまな方法の詳細については、https : //www.firebase.com/docs/ordered-data.html を参照してください。

サンプル コードと、このデータがどのように変化し、成長すると予想されるかに基づいて、いくつかのオプションがあります。

を使用してすべてを一度に取得することもできます。その場合、正しい順序でFEventTypeValueビルド済みのものを渡します。NSArrayこれは次のようになります

[listRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
  NSLog(@"value: %@", snapshot.value);
}];

これは、子のいずれかが変更されるたびにトリガーされます。ただし、テーブルを段階的に構築したい場合、このオプションはあまり適していない可能性があります。

もう 1 つのオプションは、データの構造をシフトして、組み込みの順序付けを利用することです。したがって、将来、ここにさらに多くのデータが追加される場合は、それをシフトして、同等の JSON を次のようにすることができます。

{
  "alfrescocafe": { "name": "@alfrescocafe", "type": "Truck" },
  "barshagyro": { "name": "@BarshaGyro", "type": "Truck" },
  "bigronsbistro": { "name": "@BigRonsBistro", "type": "Cart"}
}

最後に、最後のオプションを使用すると、配列構造を維持し、イベントを順番に発生させることができます。各子に優先順位を追加する必要があります。この場合、優先度は配列要素の名前になります。

于 2013-04-16T21:45:56.063 に答える