11

我正在开发一个使用 iPod 库播放一些歌曲的 iPhone 应用程序。我用下面的代码加载歌曲。问题是,在设备与 iTunes 同步后立即运行此代码时,会出现问题。显然 iPod Library 需要更新,而且需要一些时间。如果我在同步后立即进入 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 库,我应该等待它完成,或者设备在库中根本没有任何歌曲。[query items] 在这两种情况下都将返回一个空数组。

于 2010-09-14T08:03:14.020 回答
5

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

于 2011-02-24T20:15:03.237 回答