Swift MPMediaPropertyPredicate不过滤选定的专辑歌曲

时间:2014-11-16 13:46:27

标签: ios swift

我正在对媒体播放器进行第二次重写。第一个是在目标C中并且工作得很好。我在swift中建立的第二个主要是为了制作一个更高效的音乐播放器,并在新语言中加快速度。

在我的媒体选择器中,我试图在点击专辑后获得专辑歌曲。我可以按艺术家过滤,但是当我应用相册过滤器时,我得到一张空表。这是代码:

// Get the representative media item
var itemCollection: MPMediaItemCollection =
    items!.objectAtIndex(itemRow) as MPMediaItemCollection

var mediaItem: MPMediaItem = itemCollection.representativeItem

//Build the query with predicate filters
var albumPredicate: MPMediaPropertyPredicate =
    MPMediaPropertyPredicate(value: mediaItem.albumTitle,
                       forProperty: MPMediaItemPropertyAlbumTitle)

var artistPredicate: MPMediaPropertyPredicate =
    MPMediaPropertyPredicate(value: mediaItem.artist,
                       forProperty: MPMediaItemPropertyAlbumArtist)

var noCloudPredicate: MPMediaPropertyPredicate =
    MPMediaPropertyPredicate(value: NSNumber.numberWithBool(false),
                       forProperty: MPMediaItemPropertyIsCloudItem)

var query: MPMediaQuery = MPMediaQuery.songsQuery()
query.addFilterPredicate(noCloudPredicate)
query.addFilterPredicate(artistPredicate)
query.addFilterPredicate(albumPredicate)

如果我发表评论albumPredicate,我会在所选艺术家下面找到所有歌曲的正确列表,这意味着我的故事板已正确连线。此外,mediaItem.albumTitle会正确返回所选专辑标题。

3 个答案:

答案 0 :(得分:1)

汤米谢谢你的回复。我在一个查询中使用了多个filterPredicates,它在Objective C中工作。以下所有代码都适用于目标c音乐播放器,但是等效的swift albumPredicate不起作用:

MPMediaItemCollection *itemCollection = [[self items] objectAtIndex:itemIndex];
MPMediaItem *mediaItem = [itemCollection representativeItem];

MPMediaPropertyPredicate *albumPredicate =
    [MPMediaPropertyPredicate predicateWithValue:[mediaItem albumTitle]
                                     forProperty:MPMediaItemPropertyAlbumTitle];

MPMediaPropertyPredicate *artistPredicate =
    [MPMediaPropertyPredicate predicateWithValue:[mediaItem artist]
                                     forProperty:MPMediaItemPropertyAlbumArtist];
MPMediaPropertyPredicate *noCloudPredicate =
    [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO]
                                     forProperty:MPMediaItemPropertyIsCloudItem];

MPMediaQuery *query = [MPMediaQuery songsQuery];
[query addFilterPredicate:noCloudPredicate];
[query addFilterPredicate:artistPredicate];
[query addFilterPredicate:albumPredicate];

我的理解是[MPMediaQuery songsQuery]会选择歌曲并按歌曲分组。然后应用谓词。我想知道为什么它不能在swift中工作。

答案 1 :(得分:0)

我认为你不能复合专辑和艺术家谓词。我不得不写一个查询,返回艺术家的所有歌曲,然后撕掉它们并手动过滤相册。

这是我执行此操作的代码。

class func getArtistSongsWithoutSettingPlaylist(currentSong : MPMediaItem?) -> ([[MPMediaItem]], [MPMediaItem]) {
    //album->*song
    var songs = [MPMediaItem]()
    var groupedSongs = [[MPMediaItem]]()
    if currentSong != nil {
        var query = MPMediaQuery.songsQuery()
        var pred = MPMediaPropertyPredicate(value: currentSong!.albumArtist, forProperty: MPMediaItemPropertyAlbumArtist)
        query.addFilterPredicate(pred)
        var artistSongs = query.items as [MPMediaItem]
        var albumDic = Dictionary<String,Array<MPMediaItem>>(minimumCapacity: artistSongs.count)
        //fill up the dictionary with songs
        for x in artistSongs {
            if albumDic.indexForKey(x.albumTitle) == nil {
                albumDic[x.albumTitle] = Array<MPMediaItem>()
            }
            albumDic[x.albumTitle]?.append(x)
        }

        //get them back out by album and insert into array of arrays
        for (x,y) in albumDic {
            var sorted = y.sorted { $0.albumTrackNumber < $1.albumTrackNumber }
            groupedSongs.append(sorted)
        }
        //now sort the grouped playlist by year
        groupedSongs.sort { $0[0].year > $1[0].year }
        //now add all the groupplaylist into one big playlist for the media player
        for album in groupedSongs {
            songs.extend(album)
        }
        outputSongs(songs)
    }
    return (groupedSongs, songs)
}

答案 2 :(得分:0)

解决了!似乎我专注于错误的领域。当我只有一个部分时,override func tableView(tableView: UITableView, numberOfRowsInSection section: Int)中的错误代码返回0,因此在按专辑过滤时没有显示任何行。卫生署!