2017-08-14 88 views
0

我已經使用從Firebase加載的幾行創建了簡單的UITableView。 在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中分配了數據源和委託嗎? –

+0

並分享您的代碼,以便我們可以查看它並更好地瞭解您的情況。 –

+0

感謝提問,我已將其分配給viewDidLoad –

回答

0

UITableview是越來越裝上viewDidLoad,因爲會有你數組中沒有數據在最初的tableView是空白。

如果你不希望加載tableView,直到您檢索數據,那麼你可以指定你的datasourcedelegate您完成抓取您的記錄後。 (在Firebase方法的完成區塊中)

您可以顯示裝載程序,直到檢索到您的數據。

+0

謝謝你的建議!數據已經加載,因爲一切都在飛行模式下運行,我打開了離線存儲。當數據已經添加到數組時,我剛剛試圖分配數據源和委託 - 不幸的是,TableView仍然顯示爲沒有數據。我不想添加加載指示器,因爲數據已經存在。 –

0

全新安裝完您的應用程序後, 顯然,從Firebase獲取數據會有延遲。 一旦您獲取所有數據,您必須將其保存在本地數據庫中。

從第二次開始,從本地數據庫顯示數據並同時獲取firebase DB。 (如果您不更新/刪除獲取路徑的內部鍵值,則可以根據本地數據優化Firebase 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]; 

如果您使用的是Firebase脫機功能,請嘗試以下方法。 (它可能不是一個完美的解決方案)

invoke [FIRDatabase database].goOffline in viewDidLoad或app launch。 一旦執行觀察程序塊,[FIRDatabase database].goOnline

+0

謝謝你的回答!我如何顯示本地數據庫的數據? –

+0

似乎你正在使用核心數據。但我沒有找到任何保存上下文的代碼。解釋需要很長時間。如果你對ping我有興趣[email protected] –

+1

我實際上並沒有使用CoreData,我只是初始化CoreData的NSManagerObject並填充快照。我不保存上下文等。爲了使數據可以脫機使用,我使用[FIRDatabase數據庫] .persistenceEnabled = YES; –