我正在开发一个使用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];
}
我希望有人可以提供帮助。
彼得
答案 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
,你显然无法做到这一点