需要很好地解释集合和项目的 MPMediaQuery 结果

Posted

技术标签:

【中文标题】需要很好地解释集合和项目的 MPMediaQuery 结果【英文标题】:Need good explanation of MPMediaQuery results for collections and items 【发布时间】:2017-03-18 18:55:36 【问题描述】:

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

我得到了这些结果:

collections title Cosmic Thing track 8 song Channel Z collections title Cosmic Thing track 1 song Cosmic Thing collections title Wild Planet track 6 song Devil In My Car collections title Wild Planet track 2 song Dirty Back Road collections title Wild Planet track 4 song Give Me Back My Man collections title Cosmic Thing track 5 song June Bug collections title Wild Planet track 1 song Party Out Of Bounds collections title Wild Planet track 5 song Private Idaho collections title Wild Planet track 7 song Quiche Lorraine collections title Cosmic Thing track 6 song Roam collections title The B-52's track 15 song Rock Lobster collections title Wild Planet track 3 song Runnin' Around collections title Wild Planet track 8 song Strobe Light collections title Cosmic Thing track 9 song Topaz collections title Wild Planet track 9 song 53 Miles West Of Venus

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

但是,如果我改用这个打印语句,我会得到预期的结果:

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

结果:

items title The B-52's track 15 song Rock Lobster items title Cosmic Thing track 1 song Cosmic Thing items title Cosmic Thing track 5 song June Bug items title Cosmic Thing track 6 song Roam items title Cosmic Thing track 8 song Channel Z items title Cosmic Thing track 9 song Topaz items title Wild Planet track 1 song Party Out Of Bounds items title Wild Planet track 2 song Dirty Back Road items title Wild Planet track 3 song Runnin' Around items title Wild Planet track 4 song Give Me Back My Man items title Wild Planet track 5 song Private Idaho items title Wild Planet track 6 song Devil In My Car items title Wild Planet track 7 song Quiche Lorraine items title Wild Planet track 8 song Strobe Light items title Wild Planet track 9 song 53 Miles West Of Venus

另外,还有一个很奇怪的效果:如果我设置了 MusicPlayer 查询:

myMP.setQueue(with: newQry)

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

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

由于我不能 setQueuenewQry.items,我如何建立队列以按预期顺序获取专辑和歌曲?

【问题讨论】:

【参考方案1】:

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

只需要添加一行代码:

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()

【讨论】:

我很伤心,因为我没有找到有关 MPMediaQuery 的有用信息(Apple 提供的信息除外)。我正在寻找示例代码来了解如何使用 MPMediaQuery。非常感谢您的代码。我正在尝试用我的音乐库中的所有艺术家创建一个 TableView。选择一位艺术家并获取该艺术家的所有专辑或歌曲。无论如何... 不客气 - 我希望代码对你有用。你是对的 - 这种事情严重缺乏示例代码。处理播客的代码更加有限。祝你好运。 好吧,我仍在尝试使用我的图书馆 (iPhone) 中的艺术家创建一个 TableView,作为 Apple 音乐应用程序。我开始明白,第一步是创建一个集合,然后对其进行管理以获得结果。我遇到的问题是语法。在 Swift 中(就像在所有语言中一样)一个拼写错误的单词,一切都失败了。我已经失去了这么多小时......

以上是关于需要很好地解释集合和项目的 MPMediaQuery 结果的主要内容,如果未能解决你的问题,请参考以下文章

有人可以很好地解释非阻塞套接字的“发送”行为吗?

如何很好地构建具有重复元素的表单

项目09 Shell脚本基础

我是不是很好地理解词嵌入的使用,例如逻辑回归?

JPanel 使用透明 JFrame 不能很好地重新绘制

布尔逻辑和真值表解释