Firebase(Swift)重新排序表

时间:2016-08-01 09:24:25

标签: firebase swift2 firebase-realtime-database

我有一个从firebase-data解析的tableview,如:

for snap in snapshotSetlists {
    if let songsDict = snap.value as? Dictionary<String, AnyObject> {
        let key = snap.key
        let song = SongModel(songKey: key, dictionary: songsDict)
        self.songData.append(song)
    }
}

如何设置使用

启用表的永久重新排序
func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {

我知道按孩子排序是可能的,但我无法弄清楚如何在本地重新排序表后更新索引。

谢谢!

1 个答案:

答案 0 :(得分:1)

我发现你还没有得到答案 - 我自己处理同样的事情,我认为我所做的事情也是你唯一的选择。

您需要首先确保在字段上排序源查询,而不是按键排序的默认值。更改密钥比使用字段更难,也可能不是您想要做的事情。在我们的应用程序中,我们添加了一个&#34; weight&#34;每个记录的字段,以及queryOrderedByChild。任何排序键字段都可以。

完成此操作后,现在可以重新排序,并遵循大多数其他iOS案例使用的相同技术。有几种方法可以做到这一点,但如果你没有庞大的数据集,我发现最容易的方法是制作数据集的可变数组副本。如果您在表格中使用FirebaseUIFUIArray,这很容易 - 只需拨打[array items]即可为您制作该副本。

从那里,使用标准的iOS数组重新排序调用来移动数组中的项目,然后重新计算每个项目的排序键。最后,将调整后的排序键设置为Firebase。粗伪伪代码:

// Make a temp array to do the move in
NSMutableArray *temp = [[myData items] mutableCopy];
[temp removeObjectAtIndex:sourceIndexPath.row];
[temp insertObject:interest atIndex:destinationIndexPath.row];

// Renumber the items in Firebase
NSInteger sortKey = 0;
for (FIRDataSnapshot *entry in temp) {
    [[entry.ref child:@"mySortKey"] setValue:@(sortKey)];
    sortKey++;
}

根据您将表格连接到Firebase的方式,此时应自动更新。