기존의 MVC패턴의 한계를 극복하고자 MVP, 그리고 MVVM 패턴이 등장하게 되었다. MVC의 한계와 MVVM이 탄생한 이유는 여러가지가 있을 수 있겠으나, 대표적으로 다음의 이유들이 있었다.View와 Business logic간의 긴밀한 연관성에 의해 확장성, 유지보수에 어려움을 겪음추가로 View가 Model에 영향을 줄 수 있기 때문에, 터치 이상으로 복잡한 소통을 해야 할 경우 프로토콜 등을 통해 Controller에 책임을 위임함ViewController의 역할이 많아지면서 Controller가 비대해지는 Massive View Controller의 문제가 발생 이 외에도 여러 이유가 있을 수 있겠지만, 어쨌든 MVVM이 등장한 가장 핵심 이유는"View와 Model의 의존성 분리"라고 생각한..
(RxSwift를 사용하지 않고)MVVM 패턴을 사용할 때, 특정 객체의 변화를 감지하고 대응하기 위해 커스텀 Observable 클래스를 사용하곤 한다. Observable의 동작에 대해 간단히 설명하자면, 특정 값이 bind라는 메서드를 통해 closure라는 함수 타입의 프로퍼티에 전달이 되고, 그 값이 바뀔때 즉, didSet될 때 어떤 동작을 정의할 수 있다는 것인데......... 여기서 bind라는 함수가 존재하는 이유가 궁금해졌다.뒤에서 코드를 더 자세히 보겠지만, 사실 bind함수 없이 closure라는 프로퍼티 하나만으로도 충분히 의도한 동작을 할 수 있기 때문이다. 일단 Obsevable에 대해 간단히 알아보겠다.Observable의 컨셉과 구조MVVM 패턴에 대한 설명은 더 잘 정리..
영화 프로젝트를 만들던 도중 예상치 못한 오류가 발생했다.메인 뷰에서 다른 뷰로 갔다가 다시 돌아올 때 다음과 같은 오류가 떴다.현재 메인뷰는 3개의 tableView cell안에 각각 collectionView 가 있는 형태로 구성되어있다. 에러메세지를 번역기에 돌려보니 다음과 같았다.한 번만 경고: UITableView가 뷰 계층에 포함되지 않은 상태에서(테이블 뷰 또는 그 하위 뷰 중 하나가 아직 창에 추가되지 않음) 가시적인 셀 및 기타 내용을 레이아웃하도록 요청받았습니다. 이는 테이블 뷰 내부의 뷰가 올바른 정보를 알지 못한 상태에서 로드 및 레이아웃을 수행하도록 강제할 수 있으며(예: 테이블 뷰 경계, 기기 방향 모음, 레이아웃 마진, 안전 영역 인셋 등), 불필요한 레이아웃 연산이 추가로 발..
이번 글에서는 앱을 만드는 프로젝트 과정에서 발생한 문제와 해결과정에 대해 작성할 예정이다.프로젝트 내용은 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..