领域 - 更新列表顺序

Realm - Update List Order

我试图在 Realm 实用程序 class 中重新排序 TableView 中的对象。许多其他 Stack Overflow 问题都说过使用 List,但我似乎无法让它发挥作用。 (, example)。我能够成功地将对象添加到我的列表中:

public func addUserSong(song: Song) {
    let songList = List<Song>()
    songList.append(objectsIn: realm.objects(Song.self))
    try! realm.write {
        songList.append(song)
        realm.add(songList)
    }
}

但是,我在尝试时无法保留更新后的订单:

public func reorder(from: Int, to: Int) {
    let songs = List<Song>()
    songs.append(objectsIn: realm.objects(Song.self))
    
    songs.move(from: from, to: to)
    
    try! realm.write {
        realm.add(songs)
 }

我的模型是:

 class Song: Object {
   @Persisted var name: String
   @Persisted var key: String
 }

class SongList: Object {
   let songs = List<Song>()
}

谢谢!

不保证领域对象顺序。 (除非您指定排序顺序)

例如如果您从 Realm 加载 10 首歌曲,它们可能会以任意顺序进入您的应用程序,并且顺序可能会在加载之间发生变化。需要注意的是 Realm List 对象。列表始终保持其顺序。

问题中的问题是您将 Song 对象存储在 Realm 中,但如上所述,没有排序。

因此需要修改该方法,为每个用户利用一个 List 对象来跟踪他们的歌曲:

class UserClass: Object {
   @Persisted var name: String
   @Persisted var songList = List<SongClass>()
}

向用户添加歌曲时,在写入事务中调用它

try! realm.write {
   someUser.songList.append(someSong)
}

假设用户想要切换歌曲 2 和歌曲 3 的位置。同样,在写入事务中:

try! realm.write {
   someUser.songList.move(from: 2, to: 3)
}

那么 UI 位 - tableView 由 tableView 数据源支持 - 在这种情况下它将是 songList 属性。更新该数据源时,tableView 应反映该更改。

在这种情况下,您可以向 someUser.songList 添加一个 observer,随着基础数据的变化,观察者将对该变化做出反应,然后可以更新 UI。

您可以做一些简单的事情,例如 tableView.reloadData() 来反映更改,或者如果您想要 fine-grained 更改(例如行动画),您也可以这样做。在同一指南中,请参阅处理 tableView.deleteRows、.insertRows 和 .reload 的代码。您知道那里的基础数据中哪些行发生了更改,因此您可以为 tableView 中的行设置动画。