Firebase 数据排序
Firebase Data Sorting
我无法弄清楚为什么我的数据无法排序,我已经通读了 Firebase 数据排序并应用了如下所示的查询过滤器,但我的数据排序不正确。
我希望根据数据写入 firebase 的时间对数据进行排序,据我所知,我可以根据 ChildAutoID 键进行排序。所以我正在使用 queryOrderedByKey。它以相反的顺序对数据进行排序,最近的数据位于我的 UITableView 的底部。
请帮忙!
这是 Firebase 中的数据结构,非常基础。
-(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];
}];
}
另一种选择是从 Firebase 加载所有节点 children,将它们插入数组,然后对数组进行排序。最后更新表视图。在上面发布的代码中,如果节点中有 1000 children,tableView 将刷新 1000 次(每个 child 刷新一次),这可能是不必要的。 (下面的代码未经测试,就在我的脑海中)。
[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循环中过滤返回的内容,只向数组中添加您感兴趣的项目。这很大程度上取决于正在处理的child人的数量。
我无法弄清楚为什么我的数据无法排序,我已经通读了 Firebase 数据排序并应用了如下所示的查询过滤器,但我的数据排序不正确。
我希望根据数据写入 firebase 的时间对数据进行排序,据我所知,我可以根据 ChildAutoID 键进行排序。所以我正在使用 queryOrderedByKey。它以相反的顺序对数据进行排序,最近的数据位于我的 UITableView 的底部。
请帮忙!
这是 Firebase 中的数据结构,非常基础。
-(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];
}];
}
另一种选择是从 Firebase 加载所有节点 children,将它们插入数组,然后对数组进行排序。最后更新表视图。在上面发布的代码中,如果节点中有 1000 children,tableView 将刷新 1000 次(每个 child 刷新一次),这可能是不必要的。 (下面的代码未经测试,就在我的脑海中)。
[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循环中过滤返回的内容,只向数组中添加您感兴趣的项目。这很大程度上取决于正在处理的child人的数量。