swift2 Firebase(Swift)重新排序表

n53p2ov0  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(196)

我有一个从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) {

我知道按子表排序是可能的,但我不知道如何在本地重新排序表后更新索引。
谢谢你!

ncgqoxb0

ncgqoxb01#

我知道你还没有得到答案--我自己也在处理同样的事情,我想我所做的也将是你唯一的选择。
首先,你需要确保源查询是按字段排序的,而不是默认的按键排序。更改键比更改字段更难,而且可能不是你想做的。在我们的应用程序中,我们为每条记录添加了一个“weight”字段,并在上面添加了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的方式,它应该会在此时自动更新。

相关问题