代码之家  ›  专栏  ›  技术社区  ›  RubberDucky4444

func removeFilterPredicate(u predicate:MPMediaPredicate)工作不一致

  •  0
  • RubberDucky4444  · 技术社区  · 5 年前

    我在尝试时遇到不一致的问题 func removeFilterPredicate(_ predicate: MPMediaPredicate) 从未 func addFilterPredicate(_ predicate: MPMediaPredicate)

    当我测试我的应用程序并添加谓词时,它每次都能正常工作。当我试图删除谓词时,它通常会起作用,但有时不会。

    我期望的行为是删除谓词,然后删除一首与要播放的前一个谓词不匹配的随机歌曲

    实际上,有时在我删除谓词并跳到下一首歌之后,上一个谓词中的更多歌曲仍在播放

    我添加谓词的方式是

    func getSongsWithCurrentArtistFor(item: MPMediaItem) -> MPMediaQuery {
      let artistPredicate = MPMediaPropertyPredicate(value: item.artist, forProperty: MPMediaItemPropertyArtist, comparisonType: .contains)
      let query = MPMediaQuery()
      query.addFilterPredicate(artistPredicate)
      return query
    }
    
    
    let lockArtist = MediaManager.shared.getSongsWithCurrentArtistFor(item: nowPlaying)
      if var items = lockArtist.items {
        items.shuffle()
        let descriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: MPMediaItemCollection(items: items))
        self.mediaPlayer.prepend(descriptor)
       }
    

    要删除谓词:

    func removeArtistLockFor(item: MPMediaItem) -> MPMediaQuery {
      let artistPredicate = MPMediaPropertyPredicate(value: item.artist, forProperty: MPMediaItemPropertyArtist)
      let query = MPMediaQuery()
      query.removeFilterPredicate(artistPredicate)
      return query
    }
    
    let unlockArtist = MediaManager.shared.removeArtistLockFor(item: nowPlaying)
      if var items = unlockArtist.items?.filter({ (item) -> Bool in
        return item.mediaType.rawValue <= MPMediaType.anyAudio.rawValue
          }) {
          items.shuffle()
           let descriptor = MPMusicPlayerMediaItemQueueDescriptor(itemCollection: MPMediaItemCollection(items: self.newSongs.shuffled()))
           self.mediaPlayer.prepend(descriptor)
     }
    

    我想知道A)我搬家的方式是否有问题 MPMediaPropertyPredicate

    我知道我之前发布过关于MPMediaPlayer的问题。。特别是关于 func prepend(_ descriptor: MPMusicPlayerQueueDescriptor) 但这些问题在ios13中得到了解决。这是一个新的问题…事实上,添加谓词总是有效的,这让我认为这更多的是我的错误,而不是苹果的问题。。。?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Najinsky    5 年前

    你的台词 功能

    let query = MPMediaQuery()
      query.removeFilterPredicate(artistPredicate)
    

    …似乎正在创建一个新的MPMediaQuery实例,因此除非它的行为类似于singleton(从文档中看不是这样),否则此时将没有要删除的内容。

    passedQuery.removeFilterPredicate(artistPredicate)