From 3b4b5f5b5cd81edb0ecd59a26253fb9fb1948da7 Mon Sep 17 00:00:00 2001 From: Daniel Barber Date: Wed, 12 Feb 2020 21:10:26 -0500 Subject: [PATCH] Refactor cover art refresh using Promises --- Persephone/Services/CoverArtService.swift | 95 +++++++++++++++-------- 1 file changed, 61 insertions(+), 34 deletions(-) diff --git a/Persephone/Services/CoverArtService.swift b/Persephone/Services/CoverArtService.swift index d19a307..e890a70 100644 --- a/Persephone/Services/CoverArtService.swift +++ b/Persephone/Services/CoverArtService.swift @@ -7,50 +7,77 @@ // import Foundation +import PromiseKit import Kingfisher struct CoverArtService { let song: Song + let provider: MPDAlbumArtImageDataProvider - func refresh(callback: @escaping () -> Void?) { - let provider = MPDAlbumArtImageDataProvider( + init(song: Song) { + self.song = song + + provider = MPDAlbumArtImageDataProvider( songUri: song.mpdSong.uriString, cacheKey: song.album.hash ) - - _ = KingfisherManager.shared.retrieveImage( - with: .provider(provider), - options: [ - .forceRefresh, - .memoryCacheExpiration(.never), - .processor(DownsamplingImageProcessor(size: .albumListCoverSize)), - .scaleFactor(2), - ] - ) { _ in - callback() + } + + func refreshAlbumListArt() -> Promise { + return Promise { seal in + _ = KingfisherManager.shared.retrieveImage( + with: .provider(provider), + options: [ + .forceRefresh, + .memoryCacheExpiration(.never), + .processor(DownsamplingImageProcessor(size: .albumListCoverSize)), + .scaleFactor(2), + ] + ) { result in + seal.fulfill(result) + } } - - _ = KingfisherManager.shared.retrieveImage( - with: .provider(provider), - options: [ - .forceRefresh, - .memoryCacheExpiration(.never), - .processor(DownsamplingImageProcessor(size: .currentlyPlayingCoverSize)), - .scaleFactor(2), - .callbackQueue(.mainAsync) - ] - ) { _ in } - - _ = KingfisherManager.shared.retrieveImage( - with: .provider(provider), - options: [ - .forceRefresh, - .memoryCacheExpiration(.never), - .processor(DownsamplingImageProcessor(size: .queueSongCoverSize)), - .scaleFactor(2), - ] - ) { _ in + } + + func refreshCurrentlyPlayingArt() -> Promise { + return Promise { seal in + _ = KingfisherManager.shared.retrieveImage( + with: .provider(provider), + options: [ + .forceRefresh, + .memoryCacheExpiration(.never), + .processor(DownsamplingImageProcessor(size: .currentlyPlayingCoverSize)), + .scaleFactor(2), + .callbackQueue(.mainAsync) + ] + ) { result in + seal.fulfill(result) + } + } + } + + func refreshQueueSongArt() -> Promise { + return Promise { seal in + _ = KingfisherManager.shared.retrieveImage( + with: .provider(provider), + options: [ + .forceRefresh, + .memoryCacheExpiration(.never), + .processor(DownsamplingImageProcessor(size: .queueSongCoverSize)), + .scaleFactor(2), + ] + ) { result in + seal.fulfill(result) + } + } + } + + func refresh(callback: @escaping () -> Void?) { + _ = firstly { + when(fulfilled: refreshAlbumListArt(), refreshQueueSongArt(), refreshCurrentlyPlayingArt()) + }.done { _, _, _ in NotificationCenter.default.post(name: .didReloadAlbumArt, object: nil) + callback() } } }