SeSAC iOS 데뷔과정 2기

0805 새싹 5주차 마무리

Lia's iOS 2022. 8. 7. 21:53
iOS 앱 개발자 데뷔 과정 5주차 마무리

 

 

 

 

#2. Assignment

- TMDB 프로젝트 구현하기

1. trending 정보를 보여주는 화면에서 링크 버튼을 클릭했을 때, 웹뷰가 있는 컨트롤러로 화면전환된다.

웹뷰를 활용하고, API 응답값에서 유튜브 링크를 통해 예고편 비디오 등을 실행하도록 한다.

 

API로 유튜브 링크를 연결하는건 아직 안해봤지만, 버튼을 클릭하고 웹뷰로 전환하는건 빨리 끝내겠다!

...라고 생각했으나, CollectionViewCell 내부의 버튼을 동작하게 하려면 별도의 작업이 필요했다.

tag와 addgatget을 이용하는 방법, Delegate를 이용하는 방법, 클로저를 이용하는 방법 총 세 가지의 방법이 있다.

 

이 중 Delegate를 이용하여 구현했는데, 처음엔 어려워보여서 겁먹었지만 흐름만 이해하면 전혀 어렵지 않다.

1. 프로토콜을 만들고

.

.

2. Cell Class 안에 위임자를 선언하고, 액션함수를 작성하고 연결한다.

.

.

3. 뷰컨트롤러에 위임한다.

.

.

 

4. 버튼의 실질적인 동작을 구현한다.

.

.

짜잔!

버튼을 인식하는 것까지는 성공적으로 구현했으니, 웹뷰컨트롤러로 영화의 Id를 전달하고, push하는 코드를 작성했다.

TMDBViewController

 

전달받은 영화 아이디를 통해 예고편을 서버통신으로 받아오고, 가장 첫 번째 예고편의 비디오 아이디를 받아온다.

그리고 openWebPage를 실행시키며, 받아온 비디오 아이디를 넘겨준다.

WebViewController - API 서버 통신

 

openWebPage가 실행되면 URL의 형태를 만들어 webView.load 메서드를 통해 사이트를 열면 끝!

WebViewController - webView Request

 

 

2. UI 로직을 Main Thread에서 동작할 수 있도록 개선하기

3. 수업에서 배운 내용을 활용하여, 네트워크 통신 로직을 뷰컨트롤러와 분리하기

네트워크 통신 로직 분리
UI 로직 main thread에서 동작하게 하기

 

 

 

- 로또 API 개선하기

서버 통신을 하되, 기존에 검색했던 회차에 대해서는 UserDefaults에 해당 회차에 대한 내용을 저장하고, 기존에 검색했던 회차를 다시 검색한 경우에는 서버 통신을 진행하지 않고 UserDefaults에서 값을 가져올 수 있도록 구현하기

 

우선 UserDefaults에 값을 저장하기 위해, 회차를 Key로 가지고, 당첨번호 리스트를 Value로 가지는 변수를 만들려고 한다. 

구상한 방법을 대충 플레이그라운드에 끄젹여봤다.

 

그리고 Picker가 선택되었을 때, Userdefaults 값의 유무에 따라 서버에 요청하니 제대로 동작한다☺️

 

 

 

 

# 그 외

- OS_ACTIVITY_MODE

웹뷰 연결은 성공적이라고 생각하는데, 콘솔창에 계속 무서운 로그들이 찍혔다.

뭐예요 무서워요...

처음에는 뭔가 엄청난 잘못을 한 줄 알고 놀랐는데, 열심히 구글링을 해보니 os의 시스템 관련 로그였다.

Xcode8버전부터 OS_ACTIVITY_MODE 가 생겨서 불필요한 로그들이 콘솔창에 찍히는 경우가 많아졌다고 한다.

해결 방법은 Xcode 상단 Produst -> Scheme -> edit scheme 로 들어가서 아래 창까지 이동한 다음

UserDefaults.standard.set(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")

Environment Variables에서 + 버튼을 누르고,  Name에 OS_ACTIVITY_MODE,  Value에 disable를 입력하면 된다!

다만 어디까지나 임시 해결책으로, 필요한 로그도 출력되지 않을 수 있으니 주의해야한다.

 

+ 화면상으로는 UI가 제대로 잘 나오지만, 오토레이아웃이 깨진다고 콘솔창이 시끄러울 때...

아무리 고쳐도 깨진 레이아웃을 바로잡을 수 없을 때 비활성화 하고 싶다면 아래 코드를 통해 비활성화 시킬 수 있다.

UserDefaults.standard.set(false, forKey: "_UIConstraintBasedLayoutLogUnsatisfiable")

 

바로 적용이 안될 때에는 한번 더 빌드하면 적용된다.