6

我有一个集合视图,您可以在其中选择要删除的多个单元格。这意味着如果删除了多个单元格,那么在 Realm 中也应该删除多个对象 - 每个单元格 1 个对象。

我有一个函数,它接受一个Int's 数组,该数组将从集合视图的选定 indexPaths 中填充。

问题是我不确定如何做到这两个
1)删除领域中的对象和
2)在List没有删除对象的情况下保持最新

我的代码是:

我得到这样的索引路径:

let indexPaths = collectionView.indexPathsForSelectedItems

这是我在 Realm 中获取 indexPaths、更新List和删除对象的函数。它当前不起作用,因为对象没有被删除。我注意到这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 })

有什么想法吗?

4

1 回答 1

17

List.removeAll()不会从 Realm 中删除对象。它只是将它们从该List对象中删除,删除它们与父对象(在本例中为favorite对象)的关系。删除对象及其父List对象是一个称为“级联删除”的功能,它仍在Realm GitHub 上进行讨论。

如果你真的想删除它们,那么只需调用realm.delete(favorite!.videos). 这将从 Realm 中删除它们并自动清除该List属性。

不过,您可能需要小心您的实施。一旦Object从 Realm 中删除 an,任何现有的对它的引用都不能重新添加回 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 中删除。

于 2017-03-20T23:20:44.110 回答