Загружать песни из библиотеки iPod сразу после синхронизации

Я разрабатываю приложение для iPhone, которое использует библиотеку iPod для воспроизведения некоторых песен. Я загружаю песни с помощью кода ниже. Проблема в том, что при запуске этого кода сразу после синхронизации устройства с iTunes возникает проблема. По-видимому, необходимо обновить библиотеку iPod, и это занимает некоторое время. Если я пойду на приложение iPod сразу после синхронизации, я увидел сообщение "Обновление библиотеки..". Если я вызову "[элементы запроса]" из моего приложения, пока это происходит, я получаю пустой массив, указывающий, что в библиотеке нет песен. Все работает отлично, когда обновление завершено. Есть ли способ решить эту проблему? Возможно, способ обнаружить, когда обновление закончено. Я пытался прослушать все 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];
 }

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

Петр

Ответ 1

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

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

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

Ответ 2

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