web-dev-qa-db-ja.com

レルムのリストからオブジェクトを削除します-Swift

削除する複数のセルを選択できるコレクションビューがあります。これは、複数のセルが削除された場合、レルム内の複数のオブジェクトも削除する必要があることを意味します-セルごとに1つのオブジェクト。

コレクションビューの選択されたindexPathsから入力されるIntの配列を受け取る関数があります。

問題は、両方を行う方法がわからないことです
1)レルム内のオブジェクトを削除して
2)オブジェクトを削除せずにListを最新の状態にします

私のコードは:

次のようなインデックスパスを取得します。

_let indexPaths = collectionView.indexPathsForSelectedItems_

これは、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 })

何かご意見は?

6
JEL

List.removeAll() レルムからオブジェクトを削除しません。 Listオブジェクトからそれらを削除し、親オブジェクト(この場合はfavoriteオブジェクト)との関係を削除します。親のListオブジェクトと一緒にオブジェクトを削除することは、「カスケード削除」と呼ばれる機能であり、レルムGitHubでは まだ議論中です です。

実際に削除したい場合は、realm.delete(favorite!.videos)を呼び出すだけです。これにより、それらがレルムから削除され、Listプロパティが自動的にクリアされます。

ただし、そこでの実装には注意が必要な場合があります。 Objectがレルムから削除されると、それに対する既存の参照をレルムに再度追加することはできません。 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)
    }
}

コレクションビューにレルム通知ブロックを設定している限り、UIからレルム通知ブロックを削除するために必要なのはこれだけです。

16
TiM