2010-08-26 58 views
10

我正在開發一款使用iPod庫播放歌曲的iPhone應用程序。我用下面的代碼加載歌曲。問題是,在設備與iTunes同步後立即運行此代碼時,出現問題。顯然,iPod庫需要更新,而且需要一些時間。如果我在同步後立即訪問iPod應用程序,我看到一條消息「更新庫」。如果我在我的應用程序中調用「[查詢項目]」,那麼我會得到一個空數組,表示庫中沒有歌曲。更新結束後,一切正常。有什麼辦法可以解決這個問題嗎?也許有一種方法來檢測更新何時結束。我試圖聽取所有NSNotifications,但更新完成時沒有人被調用。同步後立即從iPod庫中加載歌曲

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]; 
} 

我希望有人可以幫忙。

Peter

回答

11

我發現實際上有辦法看到更新完成的時間。設備將在更新結束後發佈通知。

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

唯一的問題是,我無法找到一個方法來確定的,如果該設備更新的iPod庫,我應該等待它完成或設備根本不必須在庫中的任何歌曲。在兩種情況下[查詢項目]將返回一個空數組。

+0

我現在實際上有同樣的問題 - 你是否解決了它? – shw 2011-02-24 19:44:36

4

@Peter是對的 - 實際上我發現了他的問題的解決方法。 起初,我發現MPMediaPickerController返回時nil分配和同步時啓動 - 起初我以爲它會檢查是否有訪問庫,但有時它不起作用。 現在我發現的唯一方法是檢查lastModificationDateMPMediaLibrary - 只要它發生變化,您將無法使用MPMediaQuery獲得結果 - 將您的更改延遲到該屬性停止變化時(以任何方式),並且您應該沒事的。 已經發送了一個錯誤報告 - 文檔說,當通知觸發時,您應該從庫中重新加載緩存的對象,但如果MPMediaQuery返回nil返回nil對於您嘗試查找的每個對象,則顯然無法執行此操作。

+0

您已複製某人帖子的答案。 – 2017-09-25 12:04:42

+0

可能來自此鏈接http://www.wwml.tech/questions/192391/load-songs-from-ipod-library-right-after-sync – 2017-09-25 12:04:50