2017-03-20 70 views
2

我有一個集合視圖,您可以選擇多個單元格刪除。這意味着如果刪除多個單元格,則還應該在每個單元格的Realm-1對象中刪除多個對象。刪除對象 - 斯威夫特

我有一個函數,它接受的,這將從集合視圖的所選indexPaths填充Int的陣列。

的問題是,我不知道如何做到既
1)刪除領域和對象
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 })

有什麼想法?

回答

6

List.removeAll()不從境界刪除對象。它只是將它們從List對象中移除,刪除它們與父對象(在本例中爲favorite對象)的關係。刪除對象及其父對象List是Realm GitHub上稱爲「級聯刪除」和it's still being discussed的功能。

如果你確實要刪除它們,然後只需撥打realm.delete(favorite!.videos)。這將從領域中刪除它們並自動清除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) 
    } 
} 

只要你設置了一個域通知塊上您的收藏來看,這應該是所有你需要做的讓他們從你的用戶界面中刪除。

+0

精彩的解釋!在幫助其他人方面,你是所有軟件開發領域的最佳人選 - 再次感謝您始終以良好的方式提供清晰直接的答案:) – JEL

+0

快速跟進,因爲這是由用戶發起的,您是否建議使用通知塊或使用Realm的'Interface-Driven Write'來刪除選中的單元格? – JEL

+0

喜添,能否請你看看這個(我沒有看到任何領域的示例代碼,以幫助它):http://stackoverflow.com/questions/42988499/realm-object-level-notifications- inside-uicollectionviewcells – JEL