削除する複数のセルを選択できるコレクションビューがあります。これは、複数のセルが削除された場合、レルム内の複数のオブジェクトも削除する必要があることを意味します-セルごとに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 })
何かご意見は?
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からレルム通知ブロックを削除するために必要なのはこれだけです。