让我们说有5个歌曲对象,即Song *song1, *song2, *song3, *song4, *song5
现在共有三个班级Song, Playlist, MasterCollection
如名称所示,Song
类可用于创建新歌,打印歌曲等。
Playlist
课程可以创建新的播放列表并为其添加歌曲或删除歌曲。
MasterCollection包含一个播放列表列表和一个可用于创建所有歌曲库的方法。
我的问题是,我想定义我的方法,以便当从masterCollection的库中删除一首歌时,它也应该从播放列表中删除。
所以我做了类似的事。
我定义了一个名为mainCollection的MusicCollection类的新对象,并为其添加了歌曲。
[MainCollection.library addObject: song1];
[MainCollection.library addObject: song2];
[MainCollection.library addObject: song3];
[MainCollection.library addObject: song4];
[MainCollection.library addObject: song5];
我使用播放列表类创建了一个播放列表
[playlist1 addsong:mainCollection.library[0]];
[playlist1 addsong:mainCollection.library[3]];
[playlist1 addsong:mainCollection.library[2]];`
想法是在从mainCollection中删除song1时更新播放列表。
[mainCollection.librray removeObject: song1];
但是播放列表1没有更新。它仍然显示有3首歌曲。
有任何方法可以达到这个目的吗?
答案 0 :(得分:1)
当你这样做时
[playlist1 addsong:mainCollection.library[0]];
Objective-C将mainCollection.library
数组的元素置于索引零处,并将其引用添加到playlist1
数组中。此时,song1
对象有两个引用它的集合 - mainCollection.library
和playlist1
。这两个集合彼此独立,因此您无法操纵其中一个集合来更改另一个集合的内容。
有几种方法可以解决这个问题。
最常见的方法是删除对被删除歌曲的所有引用:它不是太昂贵,而且很容易实现。
另一种常见的方法是设置一个将歌曲连接到播放列表的集合 - 例如,NSMutableDictionary
和Song
作为键(您需要实现哈希码和相等方法)和{{1 } NSMutableArray
s作为元素。此集合会产生维护问题,但可以避免搜索不包含歌曲的播放列表。
最后,您可以使用"墓碑"图案。不是将歌曲存储在主列表和播放列表中,而是存储特殊的Playlist
对象。除了SongReference
的引用外,Song
还可以有SongReference
标记。您只需将isDeleted
标记为已删除,而不是从大量集合中删除歌曲。不幸的是,你的其余代码将有一个任务要注意歌曲是否被删除。