2010-08-26 71 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

相关问题