首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为下一个队列(MediaPlayer)洗牌NSMutableArray和“洗牌专辑”?

为下一个队列(MediaPlayer)洗牌NSMutableArray和“洗牌专辑”?
EN

Stack Overflow用户
提问于 2015-05-07 13:06:43
回答 1查看 445关注 0票数 1

我已经成功地创建了一个工作(几乎)完美的下一个排队系统。我可以移动,删除和添加歌曲到名单上,根本没有任何问题。我遇到的唯一问题是,当用户决定使用洗牌模式(例如MPMusicShuffleMode.Songs)时,up next视图仍然显示旧的顺序(假设洗牌模式设置为off)。应用程序Ecoute有一个类似的排队系统,但它也可以在洗牌时工作。

我已经意识到,Ecoute不使用MPMusicShuffleMode,如果您进入股票音乐播放器后,按洗牌在埃库特,它保持不变。我想出了一种方法来显示洗牌歌曲的正确顺序(只需洗牌NSMutableArray并将其设置为新队列)。真正的问题是,当用户想要“洗牌专辑”时,我该如何调整这个数组呢?如果这有帮助的话,NSMutableArray包含MPMediaItem

非常感谢。

编辑:

这一尝试奏效了,但随着歌曲数量的增加,时间呈指数增长。2000首歌花了25到35秒,非常慢。

代码语言:javascript
复制
else if(self.shuffleMode == "Songs"){
        self.shuffleMode = "Albums"
        self.shuffle.setTitle("Shuffle Albums", forState: UIControlState.Normal)
        var queueCopy = NSMutableArray(array: self.queue.items)
        var newQueue = NSMutableArray(array: [])

        var albums = MPMediaQuery.albumsQuery().collections as [MPMediaItemCollection]
        var albumsCopy = NSMutableArray(array: albums)
        shuffleArray(albumsCopy)

        for album in albumsCopy{
            for item in queueCopy{
                if (album.representativeItem!.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString == item.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString){
                    for(var i = 0; i < album.items!.count; i++){
                        if(album.items![i].valueForProperty(MPMediaItemPropertyTitle) as NSString == item.valueForProperty(MPMediaItemPropertyTitle) as NSString){
                            newQueue.addObject(item as MPMediaItem)
                        }
                    }
                }
            }
        }

        let newQueueToSet = MPMediaItemCollection(items: newQueue)
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        appDelegate.currentQueue = newQueueToSet
        self.queue = newQueueToSet

        self.player.setQueueWithItemCollection(newQueueToSet)

}

编辑2:

成功地把它降到了8秒,但远没有接近Ecoute的1到2秒。

8第二版:

代码语言:javascript
复制
        var albumNames = [String]()
        for item in queueCopy{
            albumNames.append(item.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString)
        }

        let unique = NSSet(array: albumNames).allObjects as [MPMediaItem]
        var uniqueAlbumNames = NSMutableArray(array: unique)
        shuffleArray(uniqueAlbumNames)

        for name in uniqueAlbumNames{
            for item in queueCopy{
                if item.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString == name as NSString{
                    newQueue.addObject(item as MPMediaItem)
            }
        }
}

最后编辑:

我坚持的最后一段代码。大约需要7-8秒,近3000首歌曲。

代码语言:javascript
复制
    @IBAction func shufflePressed(sender: AnyObject) {

    if self.shuffleMode == "Off"{
        self.shuffleMode = "Songs"
        self.shuffle.setTitle("Shuffle All", forState: UIControlState.Normal)
        self.shuffle.setTitle("Shuffling", forState: UIControlState.Highlighted)


        var queueCopy = NSMutableArray(array: self.queue.items)
        self.unshuffledQueueCopy = self.queue

        shuffleArray(queueCopy)
        let newQueue = MPMediaItemCollection(items: queueCopy)
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        appDelegate.currentQueue = newQueue
        self.queue = newQueue

        self.player.setQueueWithItemCollection(newQueue)

    }
    else if(self.shuffleMode == "Songs"){
        self.shuffleMode = "Albums"
        self.shuffle.setTitle("Shuffle Albums", forState: UIControlState.Normal)

        var queueCopy = NSMutableArray(array: self.queue.items)
        var newQueue = NSMutableArray(array: [])

        var albums = MPMediaQuery.albumsQuery().collections as [MPMediaItemCollection]
        var albumsCopy = NSMutableArray(array: albums)
        shuffleArray(albumsCopy)


        // Takes 8 seconds for 3000 songs

        var albumNames = [String]()

        for item in queueCopy{
            albumNames.append(item.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString)
        }

        let unique = NSSet(array: albumNames).allObjects as [MPMediaItem]
        var uniqueAlbumNames = NSMutableArray(array: unique)
        shuffleArray(uniqueAlbumNames)


        for name in uniqueAlbumNames{
            for item in queueCopy{
                if item.valueForProperty(MPMediaItemPropertyAlbumTitle) as NSString == name as NSString{
                    newQueue.addObject(item as MPMediaItem)
                }
            }
        }

        let newQueueToSet = MPMediaItemCollection(items: newQueue)
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        appDelegate.currentQueue = newQueueToSet
        self.queue = newQueueToSet

        self.player.setQueueWithItemCollection(newQueueToSet)

    }
    else if(self.shuffleMode == "Albums"){
        self.shuffleMode = "Off"
        self.shuffle.setTitle("Shuffle", forState: UIControlState.Normal)
        var queueCopy = NSMutableArray(array: self.unshuffledQueueCopy.items)
        var nowPlayingItem = self.player.nowPlayingItem
        for(var i = 0; i < queueCopy.count; i++){
            if(queueCopy[i] as MPMediaItem == nowPlayingItem){
                self.fromIndex = i
            }
        }
        let newQueue = MPMediaItemCollection(items: queueCopy)
        let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
        appDelegate.currentQueue = newQueue
        self.queue = newQueue

        self.player.setQueueWithItemCollection(newQueue)
        self.fromItem = newQueue.items[fromIndex + 1] as MPMediaItem

    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-07 15:52:36

因此,在伪代码中,它看起来如下所示。

  1. 循环数组,只生成一个新的专辑数组
  2. 洗牌新专辑数组
  3. 循环新专辑数组,查看该相册中项目的原始数组。
  4. 在比赛中,将这些歌曲写到第三个数组中,这将成为你的新播放列表。

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30101978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档