본문 바로가기

이상/iOS

[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.. 더보기
[iOS] UITableViewCell Swipe Delete 예전에 UITableView의 EditingMode와 SwipeActions에 대해 글을 작성했었다. 지금 진행 중인 개인 프로젝트에서 UITableViewCell을 스와이프하여 해당 로우를 삭제하는 기능이 필요한데 두 글에서는 너무 잡기능이 많고 정신없어서 간단하게 자주 쓰이는 Swipe Delete 기능만 기록한다. DataSource Instance Method 구현 Swipe Delete를 사용하기 위해 UITableViewDataSource의 tableView(_:canEditRowAt:), tableView(_:commit:forRowAt:) 두 가지를 구현해준다. 1 2 3 4 5 6 7 8 9 10 // Row Editable true func tableView(_ tableView: UI.. 더보기
[iOS] UIRefreshControl의 발견 인스타그램을 보다가 무심코 게시글의 가장 윗부분에서 아래로 스와이프를 하여 새로고침을 하고 있었는데 문득 이 기능을 어떻게 구현한건지 궁금해졌다. 처음에는 ActivityIndicator로 만들었겠거니 하고 예제를 찾아봤는데 전부 UITableView의 윗부분에 얹어져있는 형태였다. 자세히 보면 UITableView의 위에 addSubView된 것처럼 작동하는데 내가 원하는 것은 이게 아니었다. 인스타그램을 자세히 보면 아래로 스와이프하는 만큼 Indicator의 막대기가 채워졌고 일반적인 ActivityIndicator가 아니구나 싶어 찾아보다 UIRefreshControl을 발견했다. 1. UIRefreshControl 애플 문서를 찾아보니 UIRefreshControl과 refreshcontrol이.. 더보기