11

iPod ライブラリを使用していくつかの曲を再生する iPhone アプリケーションを開発しています。以下のコードで曲をロードします。問題は、デバイスが 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];
 }

誰かが助けてくれることを願っています。

ピーター

4

2 に答える 2

12

更新がいつ完了したかを確認する方法が実際にあることを発見しました。更新が終了すると、デバイスは通知を投稿します。

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

唯一の問題は、デバイスが iPod ライブラリを更新しているかどうかを判断する方法が見つからず、更新が完了するまで待つ必要があるか、デバイスのライブラリに曲がないことです。[クエリ項目] はどちらの場合も空の配列を返します。

于 2010-09-14T08:03:14.020 に答える
5

@Peterは正しいです-そして実際に私は彼の問題の回避策を見つけました。MPMediaPickerController最初は、同期中に割り当てて開始するとリターンが返されることを発見しました。最初nilは、ライブラリへのアクセスがあるかどうかを確認するのに役立つと思いましたが、機能しない場合もあります。今のところ私が見つけた唯一の方法は、変更をチェックすることlastModificationDateですMPMediaLibrary-それが変更されている限り、使用して結果が得られないMPMediaQuery-そのプロパティの変更が停止する瞬間まで変更を遅らせてください(あなたが好きな方法で)そしてあなたは大丈夫です。すでにバグレポートを送信しています-ドキュメントには、通知が発生したときにライブラリからキャッシュされたオブジェクトをリロードする必要があると記載されていますが、検索しようとするすべてのオブジェクトがMPMediaQuery返される場合は、明らかにそれを行うことはできません。nil

于 2011-02-24T20:15:03.237 に答える