[iOS]<BearPlay> 다음 노래로 이동 시 노래 정보 갱신

RudinP·2024년 1월 24일
0

Projects

목록 보기
27/28

다음 곡 버튼을 눌러 곡 변경 시 아무런 문제가 발생하지 않으나, 현재 재생 중인 곡이 끝나 큐에 있던 다음 곡으로 변경 시 바로 노래 정보에 대한 뷰가 변경되지 않는 현상이 발생했다.
해결하려면 다음 노래로 변경되는 순간 ViewController 및 DetailViewController 에서 이를 인식하고 뷰를 다시 로드해주어야 한다.
"다음 노래로 변경되는 순간" 은 MPMediaPlayer에서 알고 있을 것이다.
검색하기 전에는 막연하게 옵저버를 통해 가능하지 않을까 생각했다.

stackOverflow

옵저버 포스트

옵저버 추가

ViewController

이제 셀이 선택될 때가 아닌, 노래가 변경될 때를 인식하여 제목을 바꾸어주기 때문에, 기존에 다른 부분에 있던 syncSelectedRow메소드는 지워주었다.

DetailViewController

마찬가지로 DetailViewController에서도 setView()가 불리는 다른 부분은 지워주었다.

Post가 여러번 되는 문제

노래가 바뀔 때 옵저버가 여러번 실행됨을 확인했다.

처음에는 불규칙적으로 출력되는 줄 알았으나, 자세히 보니 다음과 같은 패턴을 보였다.

  1. 초기에 n번 불려짐
  2. 다음 곡으로 넘길 시(>>) 출력 횟수 동일
  3. 이전 곡으로 갈 시(<<) 출력 횟수가 증가함
  4. 이전 곡으로 인해 횟수가 증가한 후 다음 곡으로 다시 넘길 시 1회씩 줄어들고, 3회까지 줄어든다.

혹시 내가 복잡하게 코드를 짜 play등 관련 메소드 호출이 중복되어서 그런가 하고 따로 테스트 어플리케이션에 MPMusicPlayerControllerNowPlayingItemDidChange의 옵저버를 추가해봤으나 동일하게 여러번 호출됨을 확인하였다.

어쩔 수 없고..일단 해당 문제에 하루반나절을 쏟았으므로..
post의 횟수 문제를 풀어 해결하는 것이 아닌 애니메이션 호출부를 바꿔보기로 했다.
그냥 겉으로 보기에 문제가 없으면 괜찮지만, 일단 애니메이션 실행 호출이 여러번 불려 중첩되기 때문에 이를 해결해야 했다.

테이블뷰 인덱스를 통한 애니메이션 재생 판단

어차피 노래가 바뀌게되면, 노래의 셀에서의 인덱스도 바뀐다.
다만 didSet으로만 넣어주면 동일하게 syncSelectedRow함수에서 인덱스를 여러번 설정하게 되기 때문에, oldValue를 비교하여 다를 시에만 애니메이션을 재생하도록 해주었다.

좋은 방법은 아니지만, 아무리 찾아봐도(거의 8시간..) 자료가 없어서 어째서 MPMusicPlayerControllerNowPlayingItemDidChange가 여러번 post되는지 알 수 없다. 언젠간 이유를 찾을 수 있기를...

profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글