【问题标题】:Load songs from iPod Library right after sync同步后立即从 iPod 库中加载歌曲
【发布时间】:2011-04-04 11:04:19
【问题描述】:

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

希望有人能帮忙。

彼得

【问题讨论】:

    标签: iphone ipod mpmediaitem mpmediaquery


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    我发现实际上有一种方法可以查看更新何时完成。更新结束时设备会发布通知。

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

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

    【讨论】:

    • 我现在也遇到了同样的问题——你解决了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多