Building Spotify App in Swift 5 & UIKit - Part 20 - Player Cover (Xcode 12, 2021, Swift 5) - App
backward
) 클릭 시 새로운 큐 아이템 생성func playlistHeaderCollectionReusableViewDidTapPlayAll(_ header: PlaylistHeaderCollectionReusableView) {
let tracksWithAlbum: [AudioTrack] = tracks.compactMap { track in
var track = track
track.album = self.album
return track
}
PlaybackPresenter.shared.startPlayback(from: self, tracks: tracksWithAlbum)
}
album
변수가 널 값이기 때문에 플레이리스트 뷰 컨트롤러가 가지고 있는 앨범 이미지를 추가func didTapForward() {
if tracks.isEmpty {
player?.pause()
player?.play()
} else if let player = playerQueue {
player.advanceToNextItem()
guard index + 1 < tracks.count else { return }
index += 1
playerVC?.refreshUI()
}
}
// PlayBackPresenter
func refreshUI() {
controlsView.configure(with: PlayerControlsViewViewModel(title: dataSource?.songName, subtitle: dataSource?.subtitle))
imageView.sd_setImage(with: dataSource?.imageURL, completed: nil)
}
// PlayerViewController
player.advanceToNextItem
)과 함께 UI 패치 → refreshUI()
함수에서 사용하는 dataSource
가 index
업데이트를 통해 값이 변경된 상태이기 때문에 UI 패치 성공func didTapBackward() {
if tracks.isEmpty {
player?.pause()
} else if let player = playerQueue {
playerQueue?.pause()
playerQueue?.removeAllItems()
guard index - 1 >= 0 else { return }
index -= 1
var items = [AVPlayerItem]()
for idx in index..<tracks.count {
let track = tracks[idx]
guard let url = URL(string: track.preview_url ?? "") else { continue }
let item = AVPlayerItem(url: url)
items.append(item)
}
playerQueue = AVQueuePlayer(items: items)
playerQueue?.play()
playerQueue?.volume = 0
playerVC?.refreshUI()
}
}
AVQueuePlayer
내부에서 구현되어 있지 않기 때문에 새로운 큐 배열을 만들어 사용 중playerQueue
를 만들어야 하기 때문에 속도 비효율적 → 단일/복수 플레이리스트 재생 모두 단일한 player
사용할 수 있다면 보다 효율적으로 시간을 사용 가능할 것이라 예상