이번 글에서는 앱을 만드는 프로젝트 과정에서 발생한 문제와 해결과정에 대해 작성할 예정이다.프로젝트 내용은 TMDB API를 이용해 영화에 대한 데이터를 관리할 수 있는 앱을 만드는 것이다.해당 프로젝트를 개발하면서 해결하는데 가장 시간이 오래 걸렸거나, 새로운 개념을 알게되었거나, 기본적인 개념이었는데 실제 개발시 적용하지 못해서 아쉬웠었던 사례 5가지를 소개할 예정이다.물론 내가 해결한 방법이 정답은 아닐 수 있지만, 어떤한 생각의 흐름으로 해결을 했는지를 위주로 다뤄보려고 한다.Push로 이동했을 때 View의 비정상적 동작문제프로필 설정화면에서 선택된 이미지를 프로필 이미지 선택뷰로 넘기면서 push로 화면전환을 하는 과정에서 화면이 버벅거리는 문제가 발생// ProfileSettingViewCo..
일반적으로 더이상 상속되지 않을 class 앞에 `final`이라는 키워드를 붙이곤 한다.그렇게 하면 이 class는 더이상 상속되지 않을걸 알기에, 시스템의 입장에서 재정의를 위한 일련의 과정을 수행하지 않아도 되기 때문에 성능상에 이점이 있다고 알고 있었다. 그런데, 위의 문장으로는 뭔가 설명이 조금 부족해보인다.이번 글에서는 WMO와 Method Dispatch에 대한 설명과 함께 `final`을 붙이는 진짜 이유에 대해 알아보도록 하겠다.WMO: 전체 모듈 최적화xcode에 여러 개의 swift파일이 존재할 때 빌드를 하면, Swift는 각 파일을 개별적으로 컴파일한다.그런데 사실상 각각의 파일이 개별적으로 존재하는 경우는 잘 없다. 그러니까, 각 파일은 내부적으로 서로 연관이 있는 경우가 일반적..
동기와 비동기, 동시와 직렬은 Swift 공부를 하면서 한번쯤은 들어봤을 개념일 것이다.이번 글에서는 개념에 대해서는 간단하게만 짚고 넘어가고,다양한 상황에서 동기/비동기 그리고 동시/직렬처리를 했을때 출력 결과가 어떻게 나올지 예측하고, 정답여부를 체크해보겠다. 동기와 비동기 vs 동시와 직렬동기 VS 비동기동기와 비동기는 메인 쓰레드 관점에서의 구분이라고 생각하면 된다.- 동기(Sync): 여러 Task가 있을 때, 몇 개의 Task가 Queue로 보내졌다면, 메인쓰레드 입장에서 Queue로 보내진 Task가 끝날때까지 기다렸다가 다음 Task를 하는것.- 비동기(Async): Queue로 보내진 Task가 끝났는지의 여부와 상관없이, 바로 다음 Task를 진행하는 것동시 VS 직렬동시와 직렬은 Qu..
네트워크 통신 기능을 구현하는 경우 서버에서 온 응답값을 `completionHandler`를 통해 `@escaping`의 형태로 함수 밖으로 값을 빼내는 방식을 사용하게 된다.결국, 서버에서 온 응답값을 함수 밖에서 사용한다는 뜻인데 문득 이런 궁금증이 들었다."함수 밖으로 값을 뺀다는 것은 함수의 반환값으로도 할 수 있지 않을까?" 이번 글에서는 네트워킹 코드에서 반환값을 사용할 경우의 문제점과 함께 `@escaping 클로저`에 대해 알아보도록 하겠다.참고로 네트워킹 코드는 Alamofire를 기준으로 작성되었다.반환값으로 네트워킹 코드 작성시 문제점백문이 불여일견이라고, 원래 `completionHandler`와 `@escaping 클로저`를 통해 작성되어있는 네트워킹 코드를 작성해보겠다.아래 코..
UIKit에서 커스텀뷰를 만들어서 작업하는 도중에, 반복작업을 더 줄이기 위해 `addTarget()` 메서드도 커스텀뷰 안에 만들고 싶어졌다.그런데 예상한것과 다르게 제대로 동작하지 않았고, 그 이유가 궁금해져서 찾아본 결과를 정리해보도록 하겠다.UIKit의 커스텀뷰UIKit에서 반복되는 뷰를 편리하게 관리하기 위해 커스텀뷰를 만들곤 한다.예를 들어 다음과 같은 화면이 있다고 하면 각 버튼의 UI를 하나씩 전부 구성하는게 아니라, 하나의 커스텀뷰를 만들어서 일부분만 변경하여 사용할 수 있다. UIButton을 상속하는 커스텀버튼 클래스를 만들고, 버튼을 생성할때 UIButton이 아닌, 방금 만든 커스텀버튼을 타입으로 지정해주면 된다.// 커스텀버튼 클래스class SortButton: UIButton..
HTTP 프로토콜을 이용해 서버와 통신하는 경우, 클라이언트쪽에서는 서버에서 받은 데이터를 가공해서 사용해야 한다.이 과정을 디코딩이라고 하는데, 보통 Swift에서 데이터를 받는 그릇으로 struct로 만드는 편이다.그러니까, 서버에서 String형태로 오는 데이터를 struct에 담아 가공해서 데이터를 사용하는 방식이라고 생각하면 된다. 그러다보니 이런 궁금증이 생겼다."왜 class가 아닌 struct로 받는거지?" 이번 글에서는 iOS의 네트워크통신과, struct/class의 차이점을 알아보겠다.iOS의 네트워크통신클라이언트가 서버에게 "이런 데이터 가져다줘!"라고하고, 서버가 해당 데이터를 응답으로 주는걸 보통 "네트워크 통신을 한다"고한다.이러한 정보 요청에 대한 기준을 API라고 하며, 그..