[swift] RxSwift를 이용한 음악 재생 처리 방법

이번 블로그 포스트에서는 RxSwift를 이용하여 음악을 재생하는 방법에 대해 알아보겠습니다.

음악 재생을 위한 기본 설정

먼저, RxSwift를 사용하기 위해 프로젝트에 다음과 같은 의존성을 추가해야합니다.

import RxSwift
import RxCocoa
import AVFoundation

이제 음악을 재생하기 위해 AVAudioPlayer 인스턴스를 생성하고 음악 파일을 로드해야합니다.

let audioPlayer = AVAudioPlayer()
let disposeBag = DisposeBag()

func loadMusic() {
    guard let musicURL = Bundle.main.url(forResource: "music", withExtension: "mp3") else {
        return
    }
    do { 
        audioPlayer = try AVAudioPlayer(contentsOf: musicURL)
        audioPlayer.prepareToPlay()
    } catch {
        print("음악 로드 실패: \(error.localizedDescription)")
    }
}

음악 재생과 일시 정지 처리

이제 재생 버튼을 눌렀을 때 음악을 재생하고 일시 정지 버튼을 눌렀을 때 음악을 일시 정지하는 로직을 구현해보겠습니다.

let playButton = UIButton()
let pauseButton = UIButton()

playButton.rx.tap
    .subscribe(onNext: { [weak self] in
        self?.audioPlayer.play()
    })
    .disposed(by: disposeBag)

pauseButton.rx.tap
    .subscribe(onNext: { [weak self] in
        self?.audioPlayer.pause()
    })
    .disposed(by: disposeBag)

이렇게 함으로써 버튼을 탭할 때마다 해당하는 액션을 실행할 수 있습니다.

음악 재생 상태 반영

음악을 재생하고 일시 정지하는 로직을 추가했습니다. 이제 현재 음악의 재생 상태를 반영해야합니다. 예를 들어 음악이 재생 중이면 일시 정지 버튼을 활성화하고, 음악이 일시 정지 상태라면 재생 버튼을 활성화해야합니다.

let isPlaying = BehaviorRelay<Bool>(value: false)

playButton.rx.tap
    .subscribe(onNext: { [weak self] in
        self?.audioPlayer.play()
    })
    .disposed(by: disposeBag)

pauseButton.rx.tap
    .subscribe(onNext: { [weak self] in
        self?.audioPlayer.pause()
    })
    .disposed(by: disposeBag)

audioPlayer.rx.observe(Bool.self, "isPlaying")
    .subscribe(onNext: { [weak self] isPlaying in
        self?.isPlaying.accept(isPlaying ?? false)
    })
    .disposed(by: disposeBag)

isPlaying
    .subscribe(onNext: { [weak self] playing in
        self?.playButton.isEnabled = !playing
        self?.pauseButton.isEnabled = playing
    })
    .disposed(by: disposeBag)

위의 코드에서 isPlaying은 음악의 재생 상태를 나타내는 BehaviorRelay입니다.

결론

이렇게 RxSwift를 사용하여 음악을 재생하고 일시 정지하는 과정을 처리하는 방법에 대해 알아보았습니다. RxSwift는 음악 재생과 같은 비동기 작업을 처리하는 데 매우 효과적이며, 코드 가독성을 높여줍니다. 추가적으로 오류 처리와 실시간 상태 업데이트를 통해 더욱 강력한 애플리케이션을 개발할 수 있습니다.

더 자세한 내용은 RxSwift 공식 문서를 참조하십시오.