领域 - 更新列表顺序
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 中的行设置动画。
我试图在 Realm 实用程序 class 中重新排序 TableView 中的对象。许多其他 Stack Overflow 问题都说过使用 List
,但我似乎无法让它发挥作用。 (
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 中的行设置动画。