Загружайте песни из библиотеки iPod сразу после синхронизации - PullRequest
11 голосов
/ 26 августа 2010

Я разрабатываю приложение для iPhone, которое использует библиотеку iPod для воспроизведения некоторых песен.Я загружаю песни с кодом ниже.Проблема в том, что при запуске этого кода сразу после синхронизации устройства с iTunes возникает проблема.По-видимому, библиотека iPod должна быть обновлена, и это занимает некоторое время.Если я сразу после синхронизации захожу в приложение iPod, я вижу сообщение «Обновление библиотеки ...».Если я вызываю «[query items]» из моего приложения, когда это происходит, я получаю пустой массив, указывающий, что в библиотеке нет песен.Все отлично работает, когда обновление закончено.Есть ли способ решить эту проблему?Может быть, способ определить, когда обновление закончится.Я пытался прослушать все NSNotifications, но никто не был вызван, когда обновление закончилось.

    MPMediaQuery *query = [MPMediaQuery songsQuery];

 // convert all items to abstracted media item
 NSArray *items = [query items];

 NSMutableArray *convertedItems = [[NSMutableArray alloc] initWithCapacity:[items count]];
 for (MPMediaItem *item in items) {
  REMediaItem *mediaItem = [[REMediaItem alloc] initWithMediaItem:item];
  [convertedItems addObject:mediaItem];
  [mediaItem release];
 }

Я надеюсь, что кто-то может помочь.

Питер

Ответы [ 2 ]

12 голосов
/ 14 сентября 2010

Я обнаружил, что на самом деле есть способ узнать, когда обновление будет завершено.Устройство будет публиковать уведомление, когда обновление закончится.

[[MPMediaLibrary defaultMediaLibrary] beginGeneratingLibraryChangeNotifications]
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self 
                       selector:@selector(iPodLibraryDidChange)
                           name: MPMediaLibraryDidChangeNotification 
                         object:nil];

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

5 голосов
/ 24 февраля 2011

@ Питер прав - и на самом деле я нашел обходной путь для его проблемы. Сначала я обнаружил, что MPMediaPickerController возвращает nil при выделении и инициализации во время синхронизации - сначала я думал, что будет работать, чтобы проверить, есть ли доступ к библиотеке, но иногда это не работает. На данный момент я нашел единственный способ проверить lastModificationDate из MPMediaLibrary - пока он меняется, вы не получите результаты, используя MPMediaQuery - откладывайте свои изменения до момента, когда это свойство перестанет изменяться (любым способом, которым вы нравится) и у тебя все будет хорошо. Вы уже отправили отчет об ошибке - в документации сказано, что вы должны перезагрузить кэшированные объекты из библиотеки при срабатывании уведомления, но вы явно не можете этого сделать, если MPMediaQuery возвращает nil для каждого объекта, который вы пытаетесь найти.

...