이번 글에서는 앱을 만드는 프로젝트 과정에서 발생한 문제와 해결과정에 대해 작성할 예정이다.프로젝트 내용은 TMDB API를 이용해 영화에 대한 데이터를 관리할 수 있는 앱을 만드는 것이다.해당 프로젝트를 개발하면서 해결하는데 가장 시간이 오래 걸렸거나, 새로운 개념을 알게되었거나, 기본적인 개념이었는데 실제 개발시 적용하지 못해서 아쉬웠었던 사례 5가지를 소개할 예정이다.물론 내가 해결한 방법이 정답은 아닐 수 있지만, 어떤한 생각의 흐름으로 해결을 했는지를 위주로 다뤄보려고 한다.Push로 이동했을 때 View의 비정상적 동작문제프로필 설정화면에서 선택된 이미지를 프로필 이미지 선택뷰로 넘기면서 push로 화면전환을 하는 과정에서 화면이 버벅거리는 문제가 발생// ProfileSettingViewCo..
동기와 비동기, 동시와 직렬은 Swift 공부를 하면서 한번쯤은 들어봤을 개념일 것이다.이번 글에서는 개념에 대해서는 간단하게만 짚고 넘어가고,다양한 상황에서 동기/비동기 그리고 동시/직렬처리를 했을때 출력 결과가 어떻게 나올지 예측하고, 정답여부를 체크해보겠다. 동기와 비동기 vs 동시와 직렬동기 VS 비동기동기와 비동기는 메인 쓰레드 관점에서의 구분이라고 생각하면 된다.- 동기(Sync): 여러 Task가 있을 때, 몇 개의 Task가 Queue로 보내졌다면, 메인쓰레드 입장에서 Queue로 보내진 Task가 끝날때까지 기다렸다가 다음 Task를 하는것.- 비동기(Async): Queue로 보내진 Task가 끝났는지의 여부와 상관없이, 바로 다음 Task를 진행하는 것동시 VS 직렬동시와 직렬은 Qu..
UIKit에서 커스텀뷰를 만들어서 작업하는 도중에, 반복작업을 더 줄이기 위해 `addTarget()` 메서드도 커스텀뷰 안에 만들고 싶어졌다.그런데 예상한것과 다르게 제대로 동작하지 않았고, 그 이유가 궁금해져서 찾아본 결과를 정리해보도록 하겠다.UIKit의 커스텀뷰UIKit에서 반복되는 뷰를 편리하게 관리하기 위해 커스텀뷰를 만들곤 한다.예를 들어 다음과 같은 화면이 있다고 하면 각 버튼의 UI를 하나씩 전부 구성하는게 아니라, 하나의 커스텀뷰를 만들어서 일부분만 변경하여 사용할 수 있다. UIButton을 상속하는 커스텀버튼 클래스를 만들고, 버튼을 생성할때 UIButton이 아닌, 방금 만든 커스텀버튼을 타입으로 지정해주면 된다.// 커스텀버튼 클래스class SortButton: UIButton..
HTTP 프로토콜을 이용해 서버와 통신하는 경우, 클라이언트쪽에서는 서버에서 받은 데이터를 가공해서 사용해야 한다.이 과정을 디코딩이라고 하는데, 보통 Swift에서 데이터를 받는 그릇으로 struct로 만드는 편이다.그러니까, 서버에서 String형태로 오는 데이터를 struct에 담아 가공해서 데이터를 사용하는 방식이라고 생각하면 된다. 그러다보니 이런 궁금증이 생겼다."왜 class가 아닌 struct로 받는거지?" 이번 글에서는 iOS의 네트워크통신과, struct/class의 차이점을 알아보겠다.iOS의 네트워크통신클라이언트가 서버에게 "이런 데이터 가져다줘!"라고하고, 서버가 해당 데이터를 응답으로 주는걸 보통 "네트워크 통신을 한다"고한다.이러한 정보 요청에 대한 기준을 API라고 하며, 그..
Swift로 개발을 하다보면 Any라는 타입을 만나게 된다.예를 들어 어떤 배열의 타입이 Any라면 그 타입에는 어떤 타입이든 들어올 수 있다는걸 뜻한다. 이 글에서는 Any타입의 특징과, 이와 비슷해보이는 AnyObject에대해 알아보도록 하겠다.Any타입의 특징Any타입을 담을 수 있는 배열에는 모든 타입이 들어올 수 있다.var somethings: [Any] = []somethings.append(true)somethings.append(iPhone) // 직접 만든 클래스의 인스턴스somethings.append("something")개발자문서에 따르면 Any타입에 포함될 수 있는 타입은우리가 알고있는 Int, String, Bool타입 등 기본 타입 뿐 아니라 튜플, 클로저 또는 함수타입까지 ..
TableView나 CollectionView에서 CustomCell을 XIB로 생성하게 되면 awakeFromNib()이라는 메서드가 생기게 된다.쉽게 이 함수의 역할을 설명하자면 ViewController에서 viewDidLoad의 역할과 비슷하다고 생각하면 된다. cell의 디자인을 해당 함수에 적용시켜놓으면 cell이 로드될때 보이게 된다. 이번 글에서는 awakeFromNib이 호출되는 시점과 prepareForReuse이 필요한 이유에 대해 알아보도록 하겠다. awakeFromNib의 호출시점원래 셀의 디자인과 데이터에 관련된 코드를 ViewContoller의 `tableView(_ tableView: , cellForRowAt indexPath: )`메서드에서 호출해서 사용했었다. 그러나, ..