2017-08-14 7 views
0

Firebaseからロードされているいくつかの行で単純なUITableViewを作成しました。 on viewWillAppear私はオブザーバを接続し、データを配列に移入します。 ビューは既にロードされていますが、非同期Firebaseコールバックはまだ呼び出されていません。 - テーブルは空白として表示されます。 コールバック後にテーブルがリフレッシュされ、期待どおりに見えますが、遅延が目立ちます。 私はオフラインモードを設定しており、オブザーバーのハンドラーは即座に呼び出されるべきであると予想していますが、そうではないと考えています。Firebaseからデータがロードされる前にUITableViewが空白として表示される

これを処理する適切な方法は何ですか? 待機中のバーは、100ms程度で、データはすでにデバイス上にあり、8行しかないので、最適なオプションではないように見えます。 解決策はありますか? ありがとうございました!

コードを守ってください。

-(void) viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 

refHandle = [areasRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) { 
    [self.arrayOfAreas removeAllObjects]; 

    for (FIRDataSnapshot* areaSnapshot in snapshot.children){ 
     Area *area = [[Area alloc] init]; 
     [area retrieveFromSnapshot:areaSnapshot]; 

     [self.arrayOfAreas addObject:area]; 
    } [self.tableView reloadData]; 
}]; } 

のviewDidLoad:

- (void)viewDidLoad { 
[super viewDidLoad]; 
self.ref = [[FIRDatabase database] reference]; 

FIRUser *currentUser = [FIRAuth auth].currentUser; 

areasRef = [[[_ref child:@"users"] child:currentUser.uid] child:@"areas"]; 

self.tableView.dataSource = self; 
self.tableView.delegate = self; 
self.tableView.tableFooterView = [[UIView alloc]init]; 
self.arrayOfAreas = [NSMutableArray new]; 
self.tableView.allowsMultipleSelectionDuringEditing = NO; } 
+0

あなたはStoryboardでdataSourceとdelegateを割り当てていますか? –

+0

とあなたのコードを共有するので、私たちはそれを見て、あなたの状況をより良く理解することができます。 –

+0

質問していただきありがとうございます。私はviewDidLoadに割り当てました –

答えて

0

、最初にtableViewが空白になっている時に、あなたの配列にデータがないだろうとあなたのUITableviewは、viewDidLoadにロードされてきています。

データを取得するまでtableViewをロードしない場合は、レコードを取得した後にdatasourcedelegateを割り当てることができます。 (Firebase Methodの完了ブロックで)

データが取得されるまでローダーを表示できます。

+0

ありがとうございました!飛行機モードではすべてが機能するため、データは既にロードされています。オフラインストレージがオンになっています。データが既に配列に追加されているときにデータソースと代理を割り当てようとしましたが、残念ながらTableViewはデータが表示されません。私はデータが既にあるので、ローディングインジケータを追加したくないです。 –

0

アプリを新しくインストールした後、 明らかに、firebaseからデータを取得するのに遅延が発生します。 すべてのデータを取得したら、ローカルDBに保存する必要があります。

2回目以降は、ローカルデータベースのデータを表示し、同時にファイアベースDBも取得します。 (フェッチ・パスの内部キー値で更新/削除を行わない場合、firebase DBフェッチ問合せはローカル・データに基づいて最適化できます)。

ローカルDBデータをarrayOfAreasに保存する場合。以下のようにオブザーブブロックを変更することができます。

NSMutableArray *arrayTemp = [[NSMutableArray alloc]init]; 

for (FIRDataSnapshot* areaSnapshot in snapshot.children){ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Area" inManagedObjectContext:[CoreData sharedData].context]; 
    Area *area = [[Area alloc] initWithEntity:entity insertIntoManagedObjectContext:nil]; 

    [area retrieveFromSnapshot:areaSnapshot]; 

    [arrayTemp addObject:area]; 
} 

/** 
if you are fetching all datas again 
*/ 
self.arrayOfAreas = arrayTemp; 
[self.tableView reloadData]; 

/** 
if you are fetching only the datas that are newly added (datas that are not existing in local DB) 
*/ 
[self.arrayOfAreas addObjectsFromArray: arrayTemp]; 
[self.tableView reloadData]; 

ファイヤーベースのオフライン機能を使用している場合は、以下の方法で試してください。 (完璧な解決策ではないかもしれません)

viewDidLoadまたはアプリの起動で[FIRDatabase database].goOfflineが呼び出されます。いったんオブザーバブロックが実行されると 、[FIRDatabase database].goOnline

+0

ありがとうございました!ローカルDBからデータをどのように表示することができましたか? –

+0

そのコアデータを使用しているようです。コンテキストを保存するコードは見つかりませんでした。説明に時間がかかる。私が興味を持ったのは[email protected]です。 –

+1

私は実際にCoreDataを使用していません。CoreDataのNSManagerObjectを初期化し、スナップショットを入力するだけです。私はContextなどを保存しません。データをオフラインで使用できるようにするには[FIRDatabase database] .persistenceEnabled = YESを使用します。 –

関連する問題