본문 바로가기

이상

[iOS] Generic을 사용해보자 (feat. ApiManager) 평소 앱을 만들 때 서버와 통신하는 부분은 ApiManager 클래스에 request 종류만큼 메소드를 만들어 사용했다. 그런데 어떤 회사의 기술면접에서 이런 상황이 있었다. 면접관: 보통 api 부분은 어떤 식으로 구현하나요? 나: 중복되는 부분을 제외하고 필요한 api 개수만큼 만듭니다. 면접관: 서로 다른 api가 만 개면 만개 다 만드나요? 나: (? 멘붕...) 네... 면접관: 그렇죠... 돌아는 가죠... 사실 언젠가 잠깐 고민을 했던 부분인데 그때는 왜 그냥 넘겼을까. 면접이 끝나고 집에 돌아오는 길에 T라는 것이 타입에 대해 자유로운 느낌이었다는 게 문득 생각이 났고 집에 오자마자 검색을 해보니 처음 Swift 공부할 때 강의에서 본 Generic이라는 놈이 있었다. 그리고 기존에 만들었.. 더보기
[iOS] 디자인 패턴 - MVC iOS 개발을 처음 시작하고 2년 정도는 정말 주먹구구식으로 개발을 했던 것 같다.지금도 '이제는 그렇지 않다'라고 딱 잘라 말할 순 없지만 클래스를 만들 생각조차도 못했었고 그냥 모조리 ViewController에 때려박았었다. 그러다 팀장님이 하시던 프로젝트를 갑자기 넘겨받게 됐는데 그때 처음 디자인 패턴이 이런거구나라는걸 느꼈다. MVC 패턴으로 구성돼있었는데 그 패턴 그대로 베껴서 내가 만들었던 프로젝트들을 다시 만들어봤다. 처음엔 디자인 패턴? 그런게 필요한가? 그냥 돌아가면 되지라는 생각으로 개발했었는데진짜 멍청하고 바보같은 생각이었다 MVC를 적용하니 정리정돈이 깔끔하게 되는 것 같은 느낌이 들었다. 이렇게 디자인 패턴은 소스를 깔끔하게 정리해 유지보수를 쉽게 할 수 있고 각 부분의 역할 분.. 더보기
[iOS] DispatchQueue - DispatchQueue.main.sync에 대해 이전 GCD 관련 글에서 Main Queue는 sync로 실행할 경우 데드락에 빠지게 되니 async로만 실행해야 한다고 Apple Doc에 나와있다고 했다. 근데 왜 그렇게하면 데드락에 빠지는건데? 라는 생각이 들었다. 대부분의 블로그에서 그 이유는 Main Thread가 Thread-safe 하지 않기 때문이라고 한다. 일단 이 글을 한 번 쭉 읽어보자. 귀찮으면 다 읽어 볼 필요도 없다. 첫번째 이미지와 첫번째 소제목만 읽으면 된다. 위 이미지는 사용자가 아이폰에서 앱 아이콘을 탭한 후 앱이 실행되기까지의 과정을 보여준다. 첫번째 소제목에는 이렇게 적혀있다. Run Loop is a mechanism that allows threads to process events at any time witho.. 더보기
[iOS] DispatchQueue - Serial, Concurrent 이전 글에서 GCD에 대해 정리했다. 이번에는 DispatchQueue가 어떻게 작동되는지 보자. 1. Serial Queue DispatchQueue의 Serial Queue는 Queue에 담긴 작업을 순차적으로 실행하며, Main Queue 또는 Custom Queue로 사용할 수 있다. Main Queue는 현재 프로세스의 Main Thread와 연결된 DispatchQueue다. 서버로부터 받아온 데이터를 화면에 뿌릴 때 (UITableView나 UICollectionView의 경우 reloadData()) 화면 갱신에 대한 소스가 담긴 클로저를 Main Queue로 보내 처리하는 경우가 많다. Main Queue - async 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16.. 더보기
[iOS] GCD - DispatchQueue GCD는 Grand Central Dispatch의 약자로 굳이 뜻 풀이를 하면 위엄있는 중앙의 파견이라는 뜻인데 우리나라의 국정원 같은 느낌이다. OS단에서 보내는, 그 누구도 중간에서 어떻게 하지 못하는 작업 정도로 이해하면 될 것 같다. 시스템에서 관리하는 DispatchQueue에 작업을 submit하여 멀티 코어 하드웨어에서 코드를 동시에 실행하게 해주는 프레임워크다. 앱 개발을 하다보면 서버에서 많은 데이터를 받거나 멀티미디어 처리와 같은 무거운 작업을 해야할 경우가 생기는데 메인에서 실행시키면 앱이 느려지기 때문에 백그라운드에서 돌리는 편이 좋다. 백그라운드에서 무거운 작업을 하고 메인에서는 화면에 보여지는 부분에 대한 작업을 하면 훨씬 효율 적이다. 이런 경우 GCD를 사용해서 OS에게 M.. 더보기
[iOS] Alamofire로 API 호출하기 (+ CocoaPods 사용법) 나는 왠만하면 외부 라이브러리는 안 쓰고 개발하려는 편인데 딱 한가지 예외로 거의 필수적으로 사용하는게 있다. 그건 바로 Alamofire. API를 호출하지 않는 앱은 극히 드물기 때문에 내가 개발하는 거의 모든 앱에서 사용한다. URLSession을 이용해서 API를 호출할 수도 있지만 Alamofire를 사용하는게 훨씬 경제적이다. Alamofire를 사용하기 위해 몇가지 간단한 세팅이 필요한데 한 번만 해보면 안 보고 할 수 있을 정도로 쉽다. Alamofire 라이브러리 세팅 후 서버로 API를 호출할 것이다. 해보자. 1. CocoaPods 설치 및 세팅 Launchpad 또는 Spotlight에서 터미널을 검색하고 실행한다. 터미널에서 아래와 같이 명령어를 입력하면 설치가 진행된다. sudo.. 더보기
[iOS] IB Designables - Failed to render and update auto layout status for ViewController: The agent threw an exception 최근 다시 iOS 앱을 만들면서 처음 보는 에러가 발생했다. 굳이 수정하지 않아도 앱은 잘 돌아간다. 때문에 처음에는 귀찮아서 무시하고 개발했지만 갈수록 눈에 거슬려서 구글링해보니 스택오버플로우에 딱 맞는 답변이 있었다. 원인은 CustomView Class를 만들 때 .xib 파일을 로드하는 부분 때문이었다. 예전에 썼던 CustomView 게시글에서 init 할 때 1 2 3 4 5 6 private func commonInit(){ Bundle.main.loadNibNamed("CustomView", owner: self, options: nil) addSubview(customView) customView.frame = self.bounds customView.autoresizingMask = [.. 더보기
[iOS] UITableView Drag & Drop으로 Row 이동 UITableView Editing Mode에서 UITableView의 setEditing()를 이용하여 row를 움직였다. 사실 row를 이동시키는 기능만 필요할 경우 이 방식보다는 cell을 Long press하여 이동시키는 방법이 훨씬 효율적이다. PC에서 바탕화면의 아이콘을 Drag & Drop으로 이동시키는 것처럼 UITableView의 Cell을 이동시키는 방법에 대해 정리한다. 1. dragInteractionEnabled, dragDelegate, dropDelegate 지정 viewDidLoad()에서 UITableView의 dragInteractionEnabled, dragDelegate, dropDelegate를 지정한다. 1 2 3 4 5 6 7 8 override func view.. 더보기