Swift Kingfisher и MPMediaItemArtwork

В настоящее время я распечатываю изображение для воспроизведения, используя следующий код.

if var strUrl = nowplaying.data.first?.track.imageurl {

                                  strUrl = strUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
                                  self.imageurl.kf.setImage(with: URL(string: strUrl), placeholder: nil)


                              }

Я хочу отправить это изображение на

MPMediaItemPropertyArtwork

который находится в следующей функции

func nowplaying(artist: String, song: String, artwork: String){     
      MPNowPlayingInfoCenter.default().nowPlayingInfo = [
      MPMediaItemPropertyTitle:song,
      MPMediaItemPropertyArtist:artist,
      MPMediaItemPropertyArtwork:artwork
    ]
}

В настоящее время у меня есть MusicPlayer.shared.nowplaying(artist: $0.track.artist, song: $0.track.title, artwork: $0.track.imageurl), который отправляет данные правильно, но затем падает - и я знаю, что это потому, что вы не можете иметь удаленное изображение в разделе обложек для MPMediaItemProperty...

Итак, мне интересно, как мне кэшировать изображение и отправить его?

использован код

let artwork = MPMediaItemArtwork(boundsSize: CGSize(width: 100, height: 100)) { size -> UIImage in

       KingfisherManager.shared.retrieveImage(with:  cover, options: nil, progressBlock: nil, completionHandler: { image, error, cacheType, imageURL in
        print(image)

        })
       return UIImage()
      }

он печатает в журнале консоли

Optional(<UIImage:0x280a4e0a0 anonymous {500, 500}>)

но, кажется, не печатает его на

MPMediaItemPropertyArtwork


person RussellHarrower    schedule 25.11.2019    source источник


Ответы (2)


Вы можете сохранить изображение в кеше и получить его, когда вам нужно.

let resource = ImageResource(downloadURL: url, cacheKey: "my_cache_key")
imageView.kf.setImage(with: resource)

Вы можете получить изображение из кеша, используя

cache.retrieveImage(forKey: "cacheKey") { result in
    //Your code
)}

Для получения дополнительной информации вы можете проверить эту ссылку https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet

Надеюсь, это сработает...

person Dinesh Choudhary    schedule 25.11.2019

Значение MPMediaItemPropertyArtwork должно быть MPMediaItemArtwork классом, а не URL или строкой. В этом классе вы можете загрузить UIImage асинхронно и установить его как обложку в Command Center.

Вот рабочий пример с Kingfisher (пожалуйста, обновите его в соответствии со структурой вашей модели):

  ImageDownloader.default.downloadImage(
    with: artworkUrl,
    options: nil,
    progressBlock: nil) { (result) in
      guard let image = try? result.get().image else { return }
      DispatchQueue.main.async {
        MPNowPlayingInfoCenter.default().nowPlayingInfo = [
          MPMediaItemPropertyTitle: song,
          MPMediaItemPropertyArtist: artist,
          MPMediaItemPropertyArtwork: image
        ]
      }
}
person Vitalii Gozhenko    schedule 25.11.2019
comment
let artwork = MPMediaItemArtwork(boundsSize: CGSize(width: 100, height: 100)) { size -> UIImage in let cover = cover.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! self.artwork.kf.setImage(с: URL(строка: обложка), заполнитель: nil) return UIImage() } Не работает - person RussellHarrower; 25.11.2019
comment
@RussellHarrower, по крайней мере, вы должны вернуть загруженный объект UIImage, а не пустое изображение, которое я использовал, например - person Vitalii Gozhenko; 25.11.2019
comment
@RussellHarrower эта информация бесполезна, если вы не укажете, где и когда вы получите сообщение об ошибке - person koen; 25.11.2019