我有一个集合视图,您可以在其中选择要删除的多个单元格。这意味着如果删除多个单元格,则还应在Realm中删除多个对象 - 每个单元格1个对象。
我有一个函数,它带有一个Int
数组,它将从集合视图的选定indexPaths中填充。
问题在于我不确定如何做到这两点
1)删除Realm中的对象和
2)让List
保持最新状态而不删除对象
我的代码是:
我得到的索引路径如下:
let indexPaths = collectionView.indexPathsForSelectedItems
这是我的函数,用于获取indexPaths,更新List
,并删除Realm中的对象。它目前无法正常工作,因为没有删除对象。我注意到removeAll
没有删除任何内容。
func removeVideos(at indexes: [Int]) {
let newVideos = List<Video>()
for (index, video) in favorite!.videos.enumerated() {
if !indexes.contains(index) {
newVideos.append(video)
}
}
let realm = try! Realm()
try! realm.write {
favorite!.videos.removeAll()
newVideos.forEach { newVideo in
favorite!.videos.append(newVideo)
}
}
}
我称之为这样的功能:
removeVideos(at: indexPaths.map { $0.item })
有什么想法?
答案 0 :(得分:13)
List.removeAll()
不会从Realm中删除对象。它只是将它们从List
对象中删除,删除它们与父对象的关系(在本例中为favorite
对象)。删除对象及其父List
个对象是一个名为“级联删除”的功能。和Realm GitHub上的it's still being discussed。
如果您确实要删除它们,请只需致电realm.delete(favorite!.videos)
。这将从Realm中删除它们并自动清除List
属性。
你可能需要小心你的实现。从Realm中删除Object
后,任何对它的现有引用都无法重新添加回Realm。仅删除newVideo
个对象本身而不是清除整个List
可能是恰当的。
func removeVideos(at indexes: [Int]) {
let newVideos = [Video]()
for (index, video) in favorite!.videos.enumerated() {
if !indexes.contains(index) {
newVideos.append(video)
}
}
let realm = try! Realm()
try! realm.write {
realm.delete(newVideos)
}
}
只要您在集合视图中设置了Realm通知块,就应该只需要将其从UI中删除即可。