swift3 - 需要对集合和项目的 MPMediaQuery 结果进行良好的解释

标签 swift3 mpmusicplayercontroller mpmediaquery

我需要一些帮助来理解 MPMediaQuery 以及如何访问结果,以便我可以通过 setQueue(with:) 使用查询。

这是我感到困惑的一个例子。

在我的音乐库中,我有一位拥有 3 张专辑的艺术家。 我的目标是查询这 3 张专辑,按每首轨道的顺序:

  • 专辑A
    • 轨道 1
    • 轨道 2
    • 轨道 3
  • 专辑2
    • 轨道 1
    • 轨道 2
    • 轨道 3
  • 专辑3
    • 轨道 1
    • 轨道 2
    • 轨道 3

当我使用此查询时,专辑/歌曲的顺序不符合预期。 即使没有打开随机播放功能,它们也几乎看起来是随机播放的。

var qryArtists = MPMediaQuery()
qryArtists = MPMediaQuery.artists()
qryArtists.groupingType = MPMediaGrouping.albumArtist
let currLoc = qryArtists.collectionSections![indexPath.section].range.location
myMP.setQueue(with: qryArtists.collections![indexPath.row + currLoc])
for junk in qryArtists.collections![indexPath.row + currLoc].items{
    print(" collections title \(junk.albumTitle!) track \(junk.albumTrackNumber) song \(junk.title!)")
}

我得到这些结果:

收藏标题 Cosmic Thing 轨道 8 歌曲 Channel Z 收藏标题 Cosmic Thing 轨道 1 歌曲 Cosmic Thing 专辑名称 Wild Planet 轨道 6 歌曲 Devil In My Car 合集标题 Wild Planet 轨道 2 歌曲 Dirty Back Road 合集标题 Wild Planet 轨道 4 歌曲 Give Me Back My Man 合集标题 Cosmic Thing 轨道 5 歌曲 June Bug 专辑名称 Wild Planet 轨道 1 歌曲 Party Out Of Bounds 收藏标题 Wild Planet 轨道 5 歌曲 Private Idaho 合集标题 Wild Planet 轨道 7 歌曲 Quiche Lorraine 专辑名称 Cosmic Thing 轨道 6 歌曲 Roam 合集标题 B-52 的轨道 15 歌曲 Rock Lobster 合集标题 Wild Planet 轨道 3 歌曲 Runnin' around 合集标题 Wild Planet 轨道 8 歌曲 Strobe Light 专辑名称 Cosmic Thing 轨道 9 歌曲 Topaz 收藏标题 Wild Planet 轨道 9 歌曲 53 Miles West Of Venus

请注意专辑/歌曲的顺序不正确

但是,如果我使用此打印语句,我会得到预期的结果:

for junk in newQry.items!{
    print("items title \(junk.albumTitle!) track \(junk.albumTrackNumber) song \(junk.title!)")
}

结果:

项目标题 B-52 的轨道 15 歌曲 Rock Lobster 项目名称 Cosmic Thing 轨道 1 歌曲 Cosmic Thing 项目名称 Cosmic Thing 轨道 5 歌曲 June Bug 项目名称 Cosmic Thing 轨道 6 歌曲 Roam 项目标题 Cosmic Thing 轨道 8 歌曲 Channel Z 项目标题 Cosmic Thing 轨道 9 歌曲 Topaz 项目名称 Wild Planet 轨道 1 歌曲 Party Out Of Bounds 项目名称 Wild Planet 轨道 2 歌曲 Dirty Back Road 项目名称 Wild Planet 轨道 3 歌曲 Runnin' around 项目名称 Wild Planet 轨道 4 歌曲 Give Me Back My Man 项目标题 Wild Planet 轨道 5 歌曲 Private Idaho 项目名称 Wild Planet 轨道 6 歌曲 Devil In My Car 项目标题 Wild Planet 轨道 7 歌曲 Quiche Lorraine 项目名称 Wild Planet 轨道 8 歌曲 Strobe Light 项目标题 Wild Planet 轨道 9 歌曲 53 Miles West Of Venus

另外,另一个非常奇怪的效果:如果我设置 MusicPlayer 查询:

myMP.setQueue(with: newQry)

然后发出相同的“items”打印语句,结果现在以与“collections”版本完全相同的方式混合!

为什么设置队列会改变查询的行为方式?

由于我无法使用 newQry.items setQueue,如何构建队列以按预期顺序获取专辑和歌曲?

最佳答案

好的,我自己通过更多的研究解决了这个问题。 这里的技巧是使用正确排序的ITEMS,并构建一个新的Collection作为队列。

只需添加一行代码即可:

let collection = MPMediaItemCollection(items: newQry.items!)

然后更改 setQueue 函数:

myMP.setQueue(with: collection)

这是最终的工作代码块 - 与我上面的原始帖子 OP 进行比较:

    let newQry = MPMediaQuery.albums()
    newQry.addFilterPredicate(
        MPMediaPropertyPredicate(
            value: artistArray[indexPath.row + currLoc],
            forProperty: MPMediaItemPropertyAlbumArtist,
            comparisonType: .equalTo
        )
    )
    //build a new collection with the sorted items then load the collection!
    let collection = MPMediaItemCollection(items: newQry.items!)
    myMP.stop()
    myMP.setQueue(with: collection)
    myMP.play()

关于swift3 - 需要对集合和项目的 MPMediaQuery 结果进行良好的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42878564/

相关文章:

iOS - 以编程方式获取当前播放的项目队列

ios - 如何获取 MPMediaItem(有声读物)各个章节

ios - 通过用户库中的耳机播放音乐

ios - 在iOS播放下一首歌曲之前,我需要先停止MusicPlayerController吗?

ios - 不能下标 [MPMediaItem] 类型的值

Tableview 内的 iOS Swift 文本字段

iOS - 从 didPickMediaItems 获取播放列表

ios - 动态设置桌面 View 高度并限制在一定范围内 swift 3?

ios - Swift 错误无法转换类型 '(AFHTTPRequestOperation?, AnyObject?) 的值 -> ()

ios - Swift 3 中的不安全字节