2015-05-03 24 views
0

我無法弄清楚爲什麼我的數據不會排序,我已經通讀了Firebase數據排序,並且正在應用如下所示的查詢篩選器,但是我的數據未正確排序。Firebase數據分類

我希望數據根據何時寫入firebase進行排序,從我的理解我可以做到基於ChildAutoID鍵。所以我使用queryOrderedByKey。它以相反的順序對數據進行排序,最近位於我的UITableView底部。

請幫忙!

以下是Firebase中的數據結構,它非常基礎。 Firebase Data Image

-(void)loadDataFromFirebase 
{ 
    NSLog(@"LOAD DATA"); 
    [self removeObservers:self]; 
    Firebase* listRef = [[Firebase alloc] initWithUrl:@"firebaseurl/feed"]; 
    [[listRef queryOrderedByKey] observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) 
    { 

     NSDictionary *refNum = @{ 
            @"ref" : snapshot.ref 
            }; 

     [self.objectData addObject:snapshot.value]; 
     [self.refData addObject:refNum]; 
     [self.myTable reloadData]; 
    }]; 

    [listRef observeEventType:FEventTypeChildRemoved withBlock:^(FDataSnapshot *snapshot) 
    { 
     [self loadDataFromFirebase]; 

    }]; 
} 
+0

所以我想出了一個解決辦法。而不是使用[self.objectData addObject:snapshot.value];並添加數組末尾的每個項目。我將它切換到[self.objectData insertObject:snapshot.value atIndex:0];不是一個很好的解決方案,但它的工作。我仍然想知道爲什麼或者我在做什麼錯誤queryOrderedbyKey – Diaonic

+1

queryOrderedByKey'確實應該按照鍵的順序觸發'FEventTypeChildAdded'事件。不幸的是,您的代碼沒有顯示足夠的數據或信息來確定發生了什麼。您能否使用一些示例數據設置Firebase(例如https://30009237.firebaseio-demo.com/),其中上面的代碼以錯誤的順序返回它們? –

回答

1

另一種選擇是加載所有節點的孩子從火力地堡,把它們插入到一個數組,然後對數組進行排序。最後更新tableview。在上面發佈的代碼中,如果節點中有1000個子項,那麼tableView將被刷新1000次(每個子項一次),這可能是不必要的。 (下面的代碼是未經測試的,就在我頭頂)。

[firebaseNode observeSingleEventOfType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { 

    for (FDataSnapshot *child in snapshot.children) { 

      NSDictionary *dict = child.value; //or craft an object instead of dict 

      [self.myMutableArray addObject:dict]; 
    } 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]; //sort by date key, descending 
    NSArray *arrayOfDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    [self.myMutableArray sortUsingDescriptors: arrayOfDescriptors]; 

    [self.tableView reloadData];  

}]; 

您還可以過濾在for循環返回的內容,只有將項目添加到數組你有興趣,很多這取決於所涉及的兒童人數。

+0

任何想法爲什麼'queryOrderedByKey'沒有排序? –

+0

@RodrigoRuiz你的意思是?我的答案的想法是通過.Value加載所有的孩子,並在代碼中按日期排序,所以queryOrderedByKey將不相關。也許你有一個關於如何使用queryOrderedByKey的問題?如果是這樣,發佈一個問題! – Jay

+0

我知道,我只是想知道你是否知道'queryOrderedByKey'沒有工作,因爲它會更好,因爲你不會浪費資源在設備中進行排序。 –