从Realm中的List中删除对象 - Swift

时间:2017-03-20 19:31:57

标签: ios swift uicollectionview realm realm-list

我有一个集合视图,您可以在其中选择要删除的多个单元格。这意味着如果删除多个单元格,则还应在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 })

有什么想法?

1 个答案:

答案 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中删除即可。