持久化 MPMediaItemCollection 对象的方法? (选自 iPod)
Posted
技术标签:
【中文标题】持久化 MPMediaItemCollection 对象的方法? (选自 iPod)【英文标题】:Way to persist MPMediaItemCollection objects? (selected from iPod) 【发布时间】:2011-11-23 18:31:51 【问题描述】:我正在制作一个应用程序,用户可以在该应用程序的设置选项卡中选择一首歌曲,并根据需要在不同的视图中播放。我想要它,以便在用户关闭应用程序并再次打开它时可以存储此项目。
我已经设法允许用户选择并存储一首歌曲:
-(IBAction)showMediaPicker:(id)sender
MPMediaPickerController *mediaPicker = [[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeAny];
mediaPicker.delegate = self;
mediaPicker.allowsPickingMultipleItems = NO;
mediaPicker.prompt = @"Select Alarm Sound";
[self presentModalViewController:mediaPicker animated:YES];
- (void) mediaPicker: (MPMediaPickerController *) mediaPicker didPickMediaItems: (MPMediaItemCollection *) mediaItemCollection
[self dismissModalViewControllerAnimated: YES];
settingsData.selectedSong = mediaItemCollection;//Object of type MPMediaItemCollection
但我希望用户每次使用该应用时都必须这样做。
我尝试过使用 NSUserDefaults:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:settingsData.selectedSong forKey:@"alarmSoundKey"];
[defaults synchronize];
但得到错误:
* -[NSUserDefaults setObject:forKey:]:尝试插入“MPMediaItemCollection”类的非属性值“”。请注意,属性列表中的字典和数组也必须只包含属性值。
请问我有哪些选择?不太清楚如何解决这个问题...
解决方案 -
我还不能回答我自己的问题,所以我把它放在这里:
我已经找到了自己的解决方案:
首先将 MPMediaItemCollection 转换/编码为 NSData 对象,然后使用 NSUserDefaults 将其存储:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"someKey"];
[defaults synchronize];
从那里,您可以在应用中的其他任何地方解码和使用....
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"someKey"];
MPMediaItemCollection *mediaItemCollection = [NSKeyedUnarchiver unarchiveObjectWithData:data]
希望这对某人有所帮助。传播这个词,这还不够。实际上已经在这个问题上工作了大约 4 个小时......
【问题讨论】:
【参考方案1】:您只能将属性列表值存储在 NSUserDefaults 中。由于 MPMediaItemCollection 符合 NSCoding 您可以使用 NSKeyedArchiver 来存储它。
http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSKeyedArchiver_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40003672
然后您稍后使用 NSKeyedUnarchiver 从文件中读回它。
【讨论】:
【参考方案2】:您也可以使用MPMediaItemPropertyPersistentID
属性。您可以在应用程序下一次启动时形成一个查询以从 iPod 库中检索项目,并优雅地处理诸如用户决定从其库中删除歌曲之类的事情。
【讨论】:
以上是关于持久化 MPMediaItemCollection 对象的方法? (选自 iPod)的主要内容,如果未能解决你的问题,请参考以下文章
ios - 如何播放 MPMediaItemCollection?
如何将 MPMediaItem 添加到 MPMediaItemCollection
使用 MPMusicPlayerController 播放 MPMediaItemCollection,如何获取播放结束时的事件
如何将 MPMediaItemCollection 保存到数据库?