1

我有以下关系:

播放列表可能有一对多的歌曲,而歌曲可能属于一对多的播放列表。

我的问题在于获取特定播放列表中歌曲的顺序 - 例如,

  • 在播放列表 1 中,顺序可能为 3,
  • 在播放列表 2 中,顺序可能为 1,
  • 在播放列表 3 中,顺序可能是 5,等等。

此外,可以更改播放列表中歌曲的顺序,因为它们在表格视图中列出。

我现在想跟踪订单。

我尝试了以下方法:

  1. 为 Song 实体创建一个新属性“PlaylistOrders” - 使用代表订单的 NSSet(播放列表的订单和 ManagedObjectId),
  2. 创建一个名为“PlaylistOrders”的新实体并将其连接到“Song”。此新实体还包含一个可转换的 objectId (ManagedObjectId)。

这两种方法似乎都非常容易出错 - 此外,我经常收到警告,例如“'NSKeyedUnarchiveFromData'不应该用于取消归档,将在未来的版本中删除”。

有没有更好、更复杂的方法在不同的播放列表中存储和检索歌曲的顺序?

4

2 回答 2

0

感谢 Eugene,它现在可以工作了——我的意思是使用 NSOrderedSet 的方法。

关于在 tableview 中重新排序歌曲项目的一个提示——以下代码片段显示了如何重新排列 NSOrderedSet 中的项目并将它们存储到 CoreData——我们只需要一个 NSMutableOrderedSet:

func moveSongItemInPlaylist(playlist: Playlist, item: SongItem, fromOrder: Int, toOrder: Int) {
    
    let orderedSet = playlist.mutableOrderedSetValue(forKey: "songItems")
    
    let indices = IndexSet(integer: fromOrder)
    
    if (fromOrder > toOrder) {
        // we're moving up
        orderedSet.moveObjects(at: indices, to: toOrder)
    } else {
        // we're moving down
        orderedSet.moveObjects(at: indices, to: toOrder - indices.count)
    }
    
    do {
        try self.managedObjectContext.save()
    } catch {
        print(error)
    }
}
于 2021-01-31T11:24:59.077 回答
0

songs在数据模型中实体的关系属性中Playlist,勾选“有序”复选框。取而代之的是NSSet,它们将在NSOrderedSet那时可用。

于 2021-01-30T20:50:02.603 回答