我需要一些帮助来理解 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/