Toy Project/Apple Music (iOS)

4. Track Model, ViewModel

개발자킹콩 2021. 2. 18. 01:45

우리는 이제 Track이라는 Struct를 만들고 Track형 데이터와 View와의 중계자 역할인 ViewModel을 만들어 볼 것이다.

 

 

[ViewModel]

 

 

 

우리는 Track가 어떤 구조로 구성되어 있는지 알고 있다. 

 

이제 TrackManager에서 Model을 정의하고, ViewModel의 메소드를 구현하겠다.

 

 

 


 

 

우선 initialize를 완성한다.

 

 

여기서 array에서 사용할 수 있는 메소드 randomElement()가 존재한다.

 

 

 

 


loadTrack()

 

 

 

 

우리는 Resource 폴더에 존재하는 음악 파일들을 읽어와서 AVPlayerItem 객체로 다루며, 이를 array로 반환할 것이다.

 

 

 

파일 위치의 url을 이용할 것이다.

Bundle은 이 앱 안에~ 를 의미한다. Bundle.main의 main은 기본적으로 제공하는 녀석이며,

이 안의 url을 가져오기 위해 제공해주는 메소드 urls()을 이용할 것이다.

 

forResourcesWithExtension: 확장자

Subdirectory: 하위 폴더

해당 urls의 변수는 URL을 담고있는 array이다.

우리는 urls변수가 파일을 읽어오지 못했을 때를 대비하여 default value를 빈깡통으로 지정했다.

 

 

 

AVPlayerItem은 url로 객체를 저장할 수 있었기에 다음과 같이 사용하면 된다.

 

 

 


 

loadTrack() 심화: Hight Order Function

 

 

 

그런데 우리는 이를 좀더 심화적으로 다루어 볼 것이다. —> High Order Function (고귀함수)

 

 

우리는 map을 이용하게 되면 이를 좀더 깐지나게 코딩할 수 있다.

 

 

우리는 url들이 들어오면 이를 어떤 형태로 변환을 시킬 것이다.

 

 

Closure를 이용하여 줄이면 아래와 같이 줄일 수 있다.

 

하지만 아래 정도까지 줄이기를 권장한다.

 

 

우리는 미래의 나와 나의 코드를 해석할 사람들을 위해 Closure를 이용하더라도 적당히 줄여야 한다.

 

 

 


 

 

 

track()

 

 

현재 tracks에서 들어온 index 순서의 데이터를 가져오면 type 이 AVPlayerItem이다.

그런데 우리는 Track이라는 type로 데이터를 반환할 것이다.

이 type을 Track으로 바꾸는 함수 convertToTrack()를 만들면 되는 것이다.

Extension+AVPlayerItem 파일에 만들어 볼 것이다.

 

 

현재 존재하는 AVPlayerItem을 extension을 통해 내가 원하는 메소드의 구조를 완성하였다.

 

 

 

 

그래서 기존의 코드의 오류부분을 잡았지만, 현재 convertToTrack()에는 우리가 원하는

type casting기능이 존재하지 않는다. 만들어보자!!

 

 

 

 


 

 

Extension+AVPlayerItem.swift

 

 

 

 

이 부분은 아래의 링크에 해석부분을 따로 담았다.

 

yeongwoo-cho.tistory.com/90

 

5. AVMetadataItem

우리는 AVPlayerItem의 데이터를 관리하다가 AVMetadataItem 타입을 알게 되었다. 이것이 무엇이고 어떻게 사용하는지를 살펴보자 우리는 AVPlayerItem type를 갖는 데이터들의 array에서 특정 index를 인자로

yeongwoo-cho.tistory.com

 

 

 

 


 

 

 

loadAlbums()

 

 

우선 이 함수가 뭐하는 지를 판단하기 위해 Track 클래스를 살펴보겠다.

 

 

 

각 트랙에는 자신이 속한 앨범의 이름이 존재한다.

그렇다면 각 앨범을 다르게 관리하면 좋은 점이 있다.

그렇기에 트랙을 주면 albumName을 기준으로 딕셔너리를 그룹핑하는 것이다.

 

우선 tracks는 현재 AVPlayitem의 array이며 이 안에 존재하는 아이템들의 타입을 Track으로 변경시킨다.

그 후, albumDics의 선언하는데 trackList 가 grouping하는 대상이 될 것이다. 그리고 뒤에 클로져는 by 에 해당한다.

각 element를 track라고 하고 이 track의 albumName를 기준(KEY)으로 딕셔너리를 만드는 것이다.

이렇게 되면 key는 albumName가 되는 것이고, value는  trackList안에 albumName가 같은 track들이 모이게 된다.

그렇기에 뒤에 코드는 해당하는 키워드들로 Album array를 반환하게 되는 것이다.

 

 

 

 


 

 

loadOtherTodaysTrack()

 

 

이건 위에 todayMusic 변수 초기화화 같음

 

 

 

 


 

 

 

여기서 중요한 점을 정리하자~

 

 

 

파일을 읽어서 이것을 AVPlayerItem로 만드는 것이다. 

우리는 파일 자체가 local에 있으니, local에 있는 파일에 접근하기 위해서 Bundle을 사용했다. 

Bundle이란 앱 안에 boundary를 의미한다.

—> 앱안에 존재하는 mp3파일들 url을 싹다 들고와라~ 그리고 array에 담은 것이다.

그리고 그 url을 기준으로 AVPlayerItem을 만들었다. 

 

 

 

 

 

track이 제일 많이 쓰이니깐 index를 지정하면 track을 가져오도록 함수를 만들었다. 

 

 

 

 

 

가져온 track들을 갖고 albumName을 기준으로 뭉쳐모여를 해서 Album객체 array를 반환하는 함수를 만들었다. 여기서 closure 사용법을 다르게 적용한 점을 주의하자 (위에서는 소괄호 밖에, 아래에서는 소괄호 안에 클로져가 존재)

 

 

 

 

 

 

헤더로 사용할 오늘의 추천곡이 랜덤으로 바뀌도록 함수를 구현하였다.

 

 

 

 

 

 

 

 

 

'Toy Project > Apple Music (iOS)' 카테고리의 다른 글

6. Header View (View 구성)  (0) 2021.02.19
5. Home CollectionView (Header View 전까지)  (0) 2021.02.18
3. Home View  (0) 2021.02.15
2. Project 분석 및 기초작업  (0) 2021.02.15
1. Apple Music Style Application Start  (0) 2021.02.15