동시성 프로그래밍 코드를 작성할 때 별도의 처리를 하지 않았다면, Main Thread 에서 View 를 그리는 일부터 시작해서 다른 모든 Task 들을 처리하고 있었다. 단순 계산은 금방 처리하여도, 서버에서 데이터를 가져오는 등 무거운 Task 를 처리하면서 View 를 그리는 작업을 책임지는 Main Thread 는 해야할 많은 Task 에 부담을 느낀다. 그러므로 Main Thread 의 부담을 줄이기 위해 아래와 같이 다른 Thread 에서도 이러한 Task 를 동시에 작업하도록 하는 것이 바로 동시성 프로그래밍이다. 그렇다면 어떻게 다른 Thread 로 Task 를 전달할 수 있을까? iOS 에서는 이러한 작업을 queue 라는 곳에 보내기만 하면 된다. 동시성 프로그래밍을 위해 지원하는 iO..
분류 전체보기
어떻게...? 서버로부터 받아오는 JSON 데이터를 바로 사용할수는 없다. 이를 프로젝트 내에서 사용할 수 있는 타입으로 디코딩하여야 한다. 다음은 서버로부터 받아오는 JSON 데이터를 디코딩하는 예시이다. // Parameter 1: JSON을 매핑시켜줄 Codable 프로토콜을 준수하는 사용자 정의 타입 대입 // Parameter 2: 서버에서 응답받는 JSON Data (== data) guard let weatherInformation = try? decoder.decode(WeatherInformation.self, from: data) else { return } Codable 프로토콜을 준수하는 사용자 정의 타입? 말은 복잡하지만 정리하자면 서버로부터 전달 받는 데이터를 저장할 수 있는 구..
일반적인 캐싱 과정 ① Memory Cache 확인 ② 없다면 Disk Cache 확인 ③ Disk Cache 에 있다면 Memory 로 올려서 캐싱 ④ Disk Cache 에 없다면 서버 통신 메모리 캐싱 vs 디스크 캐싱 캐싱에는 Memory Caching (메모리에 존재하는지 체크) 와 Disk Caching (디스크에 존재하는지 체크) 가 있다. · 메모리 캐싱 App 종료 시 메모리가 해제되면서 데이터 리소스가 삭제된다. · 디스크 캐싱 App 을 종료하더라도 데이터가 삭제되지 않으나 앱의 용량이 늘어난다는 단점이 있다. NSCache NSCache 는 그 중에서도 Memory Caching 에 주로 사용되는 클래스이며, Key - Value 형태의 데이터를 임시로 저장하는데 사용되는 가변 Co..
IBOutlet Collection 이란? IBOutlet Collection 은 하나의 뷰에 공통으로 동일한 레이아웃을 구성할 때 활용할 수 있다. IBOutlet Collection 활용 다음과 같은 뷰를 IBOutlet Collection 을 활용하지 않고 구현한다고 가정해보자. ① UIButton 에 대한 IBOutlet 변수 2개, ② UILabel 에 대한 IBOutlet 변수 2개, ③ UILabel 에 대한 IBOutlet 변수 2개, 총 6개의 IBOutlet 변수가 ViewController 상에 그려진다. 또한 이에 대한 레이아웃을 구성할 경우 하나하나 CornerRadius, font, BackgroundColor... 을 지정해줘야 하므로, 코드의 길이가 길어지고, 가독성 또한 낮..
출처: https://medium.com/@duwei199714/ios-why-the-ui-need-to-be-updated-on-main-thread-fd0fef070e7f iOS: Why the UI need to be updated on Main Thread Do you ever think about why UI really MUST to be updated on main thread? What will happened if we turn UIKit into thread-safe design? medium.com UIKit 의 모든 속성을 Thread-Safe 하게 설계하면, 느려짐 뿐만 아니라 다양한 문제를 야기한다. 대부분의 UIKit 컴포넌트들은 Not Thread-Safe 이라는 의미인 no..
CALayer 의 CA 란? CA 란 Core Animation 의 약자이다. iOS 어플을 사용할 때 화면의 부드러운 전환을 위해 최소 초당 60 프레임을 유지해야 한다. 이를 위해 OpenGL 을 사용하였으나 단순한 작업에도 코드의 양이 너무 커져서, 더 적은 코드로 그래픽을 구현할 수 있는 Core Graphics 를 만들게 되었다. 하지만 Core Graphics 도 low level 작업이라, 더욱 간단하게 사용하고자 만든게 Core Animation 이다. UIView에는 애니메이션, 렌더링, 레이아웃 등을 관리하는 Core Animation 클래스인 CALayer가 있으며, 모든 UIVIew는 layer 프로퍼티를 가지고 있다. UIView 의 CALyer 구성 UIView 는 하나의 CAL..
iOS 는 크게 4계층으로 이루어져 있다. Core OS 쪽으로 갈 수록 Hardware(IPhone) 과 가까워지며, Cocoa Touch 계층으로 갈 수록 App 과 가까워지는 계층 구조이다. Cocoa / Cocoa Touch UIKit, MapKit 등등이 포함된 계층. 주로 화면의 그래픽 UI 를 구현한다. Media 오디오, 비디오 관련된 기능을 제공하는 계층. AVFoundation (Audio Video) 음성과 영상 재생과 관련한 프레임워크. Core Service iOS 의 객체지향적인 기능을 제공하는 Core Service. 센서, GPS 등 기기 자체의 움직임이나 하드웨어 특성에 기반한 서비스를 제공한다. Core OS C 기반이며, Low Level API 로 구성되며, 환경 설정..
BreakPoint Breakpoint 를 활용하여 코드를 디버깅 할 수 있다. 디버깅 영역 Xcode 워크스페이스 중앙 아래에 있는 영역. - 변수 정보 영역 : 해당 시점에서 사용된 모든 변수들이 갖는 메모리상의 값을 출력해주는 영역 - 콘솔 영역 : 소스 코드 상에서 출력하는 모든 메시지가 나타나는 곳. print() / NSLog() 구문을 사용하여 여러 메시지를 출력 변수 정보 영역 버튼 ① Disable/Enable BreakPoint ② Pause/Continue Execution : 다음 BP 전까지 실행 ③ Step Over : 다음 라인 진행 ④ Step Into : 만들어 놓은 메서드 안으로 들어가기 ⑤ Step Out : 메서드 바깥으로 나가기 디버깅 시 사용하는 명령어 정리 ① c..
객체 지향 프로그래밍에서의 배열 구조체 // 선언만 한 경우 var words: [String] words 라는 배열 구조체는 메모리 공간을 차지하지 않고 있다. // 초기화 수행 words = [String]() 초기화가 진행되면 메모리 공간을 할당 받는다.
guard 구문과 if 구문 guard 구문은 if 구문과 마찬가지로 주어진 표현식의 결과가 참인지 거짓인지에 따라 구문의 실행 여부를 결정짓는 방식의 조건문이다. 하지만 guard 구문에는 else 블록이 필수이지만, 표현식의 결과가 참일 때 실행되는 블록이 없다. 특정 조건을 만족하지 않은 채로 후속 코드를 실행하면 심각한 오류가 발생할 경우에 전체 구문을 조기 종료(Early Exit) 하기 위한 목적으로 사용된다. if 로도 충분히 구현이 가능한데 왜 굳이 guard 라는 문법을 만들었고, 이를 사용할까? guard 구문은 본래 실행 흐름을 종료하기 위한 목적으로 사용되는 구문이기 때문에, 코드를 중첩해서 사용하지 않아도 된다는 장점이 있다. guard 문을 많이 사용해도 코드의 깊이가 깊어지지 ..