我正在尝试保存使用媒体选择器创建的歌曲播放列表。我尝试使用在使用NSUserDefaults持久化MPMediaItemCollection对象中提供的建议。此解决方案使用NSKeyedArchiver,如下所示:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"someKey"];
[defaults synchronize];
然后,当需要检索MPMediaItemCollection时,将执行以下操作:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"someKey"];
MPMediaItemCollection *mediaItemCollection = [NSKeyedUnarchiver unarchiveObjectWithData:data];
虽然一开始这似乎有效,但我发现随着时间的推移,它并不总是有效的。似乎在我的应用程序在新软件发布后加载后,播放列表中的一些媒体项目已损坏。例如,当我尝试从检索到的MPMediaItemCollection加载歌曲标题以显示在表中时,查看如下:
MPMediaItem *anItem = (MPMediaItem *)[mediaItemCollection.items objectAtIndex: row];
if (anItem) {
cell.textLabel.text = [anItem valueForProperty:MPMediaItemPropertyTitle];
if (cell.textLabel.text == nil) {
NSString * persistentID = [anItem valueForProperty:MPMediaItemPropertyPersistentID];
...
}
有些歌曲的标题为零。如果我试图在队列中的这个索引处获取歌曲的persistentID,就会有一个persistentID,但它没有指向有效的歌曲(所以它可能只是垃圾)。
所以问题是:是否可以保存一个MPMediaItemCollection,我可以确定它在所有发布和软件升级(包括我的升级和iOS升级)中都是有效的。如果是,如何?
答案不是这样的!MPMediaItemCollection对象无法转换为NSArray、NSDictionary或我们可以在NSUserDefaults中存档的任何其他对象。
我的建议是枚举整个集合,保存一个[anItem valueForProperty:MPMediaItemPropertyPersistentID]
s的数组。将其保存在NSUserDefaults
中
然后在应用程序的下一次运行中,通过NSArray进行读取和枚举,并使用具有persistentID的项创建MPMediaItemCollection。
我希望它能帮助