在同步后立即从iPod库加载歌曲

时间:2010-08-26 19:02:46

标签: iphone ipod mpmediaitem mpmediaquery

我正在开发一个使用iPod库播放一些歌曲的iPhone应用程序。我用以下代码加载歌曲。问题是,在设备与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];
 }

我希望有人可以提供帮助。

彼得

2 个答案:

答案 0 :(得分:12)

我发现实际上有一种方法可以看到更新完成的时间。更新结束后,设备将发布通知。

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

唯一的问题是我无法找到确定设备是否正在更新iPod库的方法,我应该等待它完成,或者设备根本没有库中的任何歌曲。在两种情况下,[query items]都将返回一个空数组。

答案 1 :(得分:5)

@Peter是对的 - 实际上我找到了他的问题的解决方法。 起初我发现MPMediaPickerController在分配时会返回nil并在同步时启动 - 起初我认为它可以检查是否可以访问库但有时它不起作用。 我现在找到的唯一方法是检查lastModificationDate的{​​{1}} - 只要它发生变化,您就不会使用MPMediaLibrary获得结果 - 将您的更改延迟到该属性停止的时刻改变(以任何你喜欢的方式),你应该没事。 已经发送了一个错误报告 - 文档说你应该在通知触发时从库中重新加载你的缓存对象,但如果MPMediaQuery为你试图找到的每个对象返回MPMediaQuery,你显然无法做到这一点