ios 앱 프로그래밍 ( boost course )/1. 음원 재생기 애플리케이션
AVAudioPlayer 적용
쥐수
2022. 10. 9. 15:48
728x90
1. 노래 데이터를 받아 AVAudioPlayer 지정 후 노래 길이 측정
- guard let을 이용하여 soundAsset에 Assets 파일에 sound라는 이름의 파일을 넣는다. 만일 sound라는 파일이 없으면
"음원을 찾을 수 없습니다."라는 문구 출력 후 함수를 종료한다.
- sound라는 데이터가 있어서 soundAsset 변수에 저장이 되면, do 실행한다.
AVAudioPlayer 클래스에 에셋 데이터를 넘겨서 해당 mp3 파일을 가진 객체를 생성 후 노래의 끝을 알기 위해 delegate를 채택한다.
만일 error가 발생하면 catch 내부의 문구 출력한다.
- slider의 min값은 0 , max값은 노래의 길이 ( 노래 재생 시간), 값은 노래의 현재 길이로 설정한다.
2. Timer 생성 및 발동
- Label의 형식이 00:00:00 이고, 우리는 0.01초 단위로 움직이게 하기 위해 withTimeInterval을 0.01로 설정한다.
- 노래가 끝이 나기 전까지 타이머를 계속 사용해야 하므로 , repeats를 true로 설정한다.
- block에는 unowned self 를 사용한다. ( unowned self 에 대한 설명은 밑에 )
- slider를 터치하여 노래 시간을 label에서 나타내고 있는 동안에, 타이머는 label 값을 변경하면 안 되므로 return 한다.
- 타이머의 시간을 updateTimeLabelText 함수에 보내주고, slider의 값도 현재 시간으로 변경한다.
- fire 함수를 이용하여 실행을 중단하지 않고 타이머를 반복해서 사용이 가능하다.
- 함수가 받아오는 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