쥐수의 공부노트

AVAudioPlayer 적용 본문

728x90

1. 노래 데이터를 받아 AVAudioPlayer 지정 후 노래 길이 측정

initializePlayer 함수

- guard let을 이용하여 soundAsset에 Assets 파일에 sound라는 이름의 파일을 넣는다. 만일 sound라는 파일이 없으면 

"음원을 찾을 수 없습니다."라는 문구 출력 후 함수를 종료한다.

 

- sound라는 데이터가 있어서 soundAsset 변수에 저장이 되면, do 실행한다.

AVAudioPlayer 클래스에 에셋 데이터를 넘겨서 해당 mp3 파일을 가진 객체를 생성 후 노래의 끝을 알기 위해 delegate를 채택한다.

만일 error가 발생하면 catch 내부의 문구 출력한다.

 

- slider의 min값은 0 , max값은 노래의 길이 ( 노래 재생 시간), 값은 노래의 현재 길이로 설정한다.

 

2. Timer 생성 및 발동 

makeAndFireTimer 함수

  • Label의 형식이 00:00:00 이고, 우리는 0.01초 단위로 움직이게 하기 위해 withTimeInterval을 0.01로 설정한다.
  • 노래가 끝이 나기 전까지 타이머를 계속 사용해야 하므로 , repeats를 true로 설정한다.
  • block에는 unowned self 를 사용한다. ( unowned self 에 대한 설명은 밑에 )
  • slider를 터치하여 노래 시간을 label에서 나타내고 있는 동안에, 타이머는 label 값을 변경하면 안 되므로 return 한다.
  • 타이머의 시간을 updateTimeLabelText 함수에 보내주고, slider의 값도 현재 시간으로 변경한다. 
  • fire 함수를 이용하여 실행을 중단하지 않고 타이머를 반복해서 사용이 가능하다.

updateTimeLabelText 함수

  • 함수가 받아오는 time은 currentTime이다. 
  • currentTime은 초단위로 시간을 주므로, minute에는 60을 나눈 값, second에는 60을 나눈 값의 나머지를 준다. 
  • second 와 milisecond에는 truncatingRemainder()를 이용하는데, Swift에서 % 연산은 Int 끼리만 가능하기 때문에 소수점이 있는 Double이나 Float의 나머지 연산은 truncatingremainder()를 이용한다.
  • timeText에 00:00:00으로 표시하기 위해 minute, second, milisecond 모두 String으로 변환하여 저장한다.

3. unowned

대개 스위프트에서 클로저 함수에 [ weak self ] , [ unowned self ]를 사용하게 됩니다.

weak와 unowned 이 둘을 사용하는 이유는 강한 순환 참조(Strong Reference Cycle) 발생을 막기 위해 사용합니다.

[ weak self ] , [ unowned self ]  또한 로저의 강한 순환 참조를 막기 위해 사용되는 캡처 리스트(Capture List)입니다.

 

쉽게 테이블을 이용하여 차이점을 설명합니다.

구분 weak unowned
언제 사용하나? 참조한 객체가 실제 사용할 때 해제될지도 모를 때 사용한다. 보통 짧은 주기로 참조할 때 사용한다. 참조한 객체와 생명주기가 같거나 참조한 객체가 더 길때 사용한다.
순환참조 문제?  발생하지 않는다. 발생하지 않는다.
참조된 객체가 해제되었을 때 ? 값이 nil로 변경된다. dangling pointer가 됨

dangling pointer?

  • 컴퓨터 프로그래밍에서 적절한 타입의 유효한 객체를 가리키고 있지 않는 포인터를 말한다.
728x90