Способ сохранения объектов MPMediaItemCollection? (выбран из iPod) - PullRequest
6 голосов
/ 23 ноября 2011

Я создаю приложение, в котором пользователь может выбрать песню на вкладке настроек и воспроизвести ее в другом представлении по требованию. Я хочу, чтобы этот элемент можно было сохранить, если пользователь захочет закрыть приложение и открыть его в другой раз.

Мне удалось разрешить пользователю выбирать и сохранять песню с помощью:

-(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 часов ...

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Вы можете хранить только значения списка свойств в 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 голосов
/ 17 июля 2012

Вы также можете использовать свойство MPMediaItemPropertyPersistentID.Вы можете сформировать запрос для извлечения элемента из библиотеки iPod при следующем запуске приложения и корректно обрабатывать такие вещи, как когда пользователь решает удалить песню из своей библиотеки.

...