2

Firebase からリスト データを読み込み、UITableView にデータを入力するプロジェクトに取り組んでいます。Firebase インスタンスからスナップショットが呼び出されているのを確認できますが、スナップショットはテーブルに入力されませんが、ローカルの同期 NSMutableArray はコンテンツを表示します。Firebase データがそこに到達するまで UITableView を待機させるにはどうすればよいですか?

コードは次のとおりです。

   - (void)viewDidLoad
{
    [super viewDidLoad];
    handles = [[NSMutableArray alloc] initWithObjects:@"Item No. 1", @"Item No. 2", @"Item No. 3", @"Item No. 4", @"Item No. 5", @"Item No. 6", nil];
    [self loadDataFromFirebase];
    NSLog(@"%lu", (unsigned long)[handles count]);
    self.sampleTableView.delegate = self;
    self.sampleTableView.dataSource = self;
}

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

ハンドルはアイテム番号を出力しますが、そのテスト データを削除すると、[ハンドル数] がゼロになり、Firebase からデータを取得するよりも UITableView の読み込みが速くなります。非常に感謝しています - Firebase は素晴らしいプラットフォームであり、この問題を解決できることを願っています。

4

2 に答える 2

4

Firebase では、すべてのコード (特にリアルタイム更新のブロック) が非同期であることを覚えておく必要があります。たとえば、元の質問のコメントと回避策の回答では、次のようにコーディングします。

[self loadDataFromFirebase];
[self.sampleTableView reloadData];

... 上から下まで読めません。非同期ブロックに取り込まれるデータ (または更新されるビュー)と呼び出されるデータとの間に競合状態が発生します。reloadDataセル接続がむらがあるか、GCD が他のものよりも最適化している可能性があります。

Firebase で心に留めておくべき 2 番目のことは、イベントのようなイベントchild_addedでは「完全」という概念が存在しない可能性があるということです。データが継続的にシフトおよび更新される可能性は十分にあります。繰り返しますが、いつreloadData呼ばれると思いますか? すぐに?第一子以降?最後の子?reloadDataこれが意味することは、新しいデータが追加された場合、回避策を講じてもおそらく予期しない動作が発生するということです (つまり、二度と呼び出されないため、データが表示されていないように見えます)。

ここで使用できるアプローチの 1 つは、データが変更されたときにビューを直接更新することです。したがって、ブロックは次のようになります。

[listRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
  NSLog(@"%@", snapshot.value);
  [handles addObject:snapshot.value];
  [self.sampleTableView reloadData];
}];

別のアプローチとして、Firebase を使用して内部モデルを排他的に更新し、通常の Objective-C アプローチ (KVO、通知、MVC など) を使用してデータとビューの懸念を分離し、モデルへの直接の変更以外のビューを再レンダリングすることもできます。

于 2013-04-15T22:58:52.770 に答える