본문 바로가기

학습 노트/iOS (2021)

(96)
175. Dispatch Group, Dispatch Semaphore Dispatch Group Dispatch Queue는 추가된 작업들을 가사으이 그룹으로 관리한다. 이는 서로 다른 Queue에 추가된 작업을 동일한 그룹으로 관리하는 것도 가능하다. 이름 그대로 여러 작업을 하나로 묶는 개념이다. 따라서 묶인 모든 작업이 완료돼야 그룹이 완료된다. // // DispatchGroupViewController.swift // Concurrency Practice // // Created by Martin.Q on 2021/12/23. // import UIKit class DispatchGroupViewController: UIViewController { let workQueue = DispatchQueue(label: "WorkQueue", attributes: .c..
174. Dispatch Work Item & Dispatch Source Timer Dispatch Work Item GCD에서 Task 를 Capsule화 하는 Class이다. 이를 직접 실행할 수 있지만, 보통은 Queue나 Diaspatch Source에 추가하는 방식으로 사용한다. 취소에 관한 API를 제공하지만 효율적이지는 못하다. 만약 필요하다면 Operation Queue와 Operation을 활용해 사용하는 것이 좋다. // // DispatchWorkItemViewController.swift // Concurrency Practice // // Created by Martin.Q on 2021/12/23. // import UIKit class DispatchWorkItemViewController: UIViewController { let workQueue = Dis..
173. GCD #1 (Grand Central Dispatch) Grand Central Dispatch GCD는 Thread를 자동으로 생성하고, 효율적으로 관리하는 역할을 한다. Thread Pool을 사용하기 때문에 자원을 최대한 적게 사용하면서 빠른 성능을 제공한다. 또한, 직관적이고 단순한 API를 제공한다. GCD는 모든 애플 기기들에서 동일하게 사용할 수 있다. GCD의 핵심 객체는 Dispatch Queue이다. Task를 추가할 때는 Block의 형태로 추가하거나, Dispatch Work Item으로 Capsule화 해서 추가한다. FIFO 방식으로 Task를 관리하고, 환경과 방식에 따라 실행 순서를 제어한다. 이러한 모델을 Work-Queu Programming Model이라고 부르기도 한다. Dispatch Queue는 Task를 실행하는 방식..
172. Interoperation Dependencies Operation간의 의존성 (Interoperation Dependencies) Operation 사이의 의존성은 실행 순서를 결정한다. 의존성을 가지지 않은 Operation은 동시에 실행되고, 의존성을 가진 Operation은 이전 Operation이 완료되거나 취소된 경우 실행된다. 간단히 말하면 이전에 작성한 Complition Handeler를 통해 작동하는 Operation이 해당한다. 이들의 의존성은 단방향이며, 상호 의존은 불가능하고, 복수의 의존성을 가질 수는 있다. 이는 서로 다른 Operation Queue에 존재하더라도 유효하다. Operation Class는 이를 위한 세가지 속성을 제공한다. addDependency() 의존성을 추가할 때 사용한다. removeDependenc..
171. Operation & Operation Queue Operation Operation은 하나의 작업을 나타내는 객체이다. 일반적으로 Operation Class를 상속한 Block Operation을 사용하지만 Operation Class를 SubClassing 하고 Custom Operation을 생성해 사용하기도 한다. Operation의 장점 Operation 사이의 의존성 추가(Interoperation Dependencies) Operation들 사이에 의존성을 추가해 실행 순서를 제어할 수 있다. 실행 취소(Cancellation) Completion Handler API 제공 t Value Observing을 사용해 상태를 감시하고, 우선순위 설정에 필요한 API를 함꼐 제공한다. Operation은 Single-shot Object이다. ..
169 ~ 170. Timer & Runloop and Concurrency Programming Timer & Runloop Timer는 지정된 주기마다 반복되는 코드를 실행할 때 사용할 수 있다. Timer가 제공하는 API는 단순하지만 Runloop에 대한 이해가 없다면 원하는 결과를 얻기 어렵다. Runloop 다양한 이벤트를 처리하기 위해 사용하는 Event Processing Loop이다. 앱이 시작되면 Main Thread에서 동작하는 Runloop가 자동으로 생성된다. Background Thread에서 Runloop가 필요한 경우 직접 구성해야 한다. Runloop는 Thread에서 발생하는 Event Source를 감시한다. iOS는 Event Source로부터 새로운 Event가 도착하면 Thread를 깨워 Runloop로 이벤트를 전달한다. 이후 Runloop는 등록된 Handl..
168. Debugging Auto Layout Debugging Auto Layout Auto Layout에서 오류가 발생하는 이유는 필요한 제약이 추가되지 않은 경우 필요 이상의 제약이 중복돼 있는 경우 처럼 명확하다. 필요한 제약만 올바르게 추가한다면 문제가 발생하는 경우는 없다. 하지만 코드를 사용해 제약을 추가하는 경우 앱을 실행할 때까지 결과를 확인할 수 없으므로, 이러한 규칙을 지키기 어려울 때도 있다. Missing Constraints 예시는 위와 같다. leading 제약만 추가돼있고, Indicator가 붉은 색으로 표시된다. Interface Builder에서는 여러 방식으로 오류를 표현한다. Design Time Visual Indicator Scene에서 해당 제약을 붉게 표현한다. Constraint Issue Indicat..
167. Constraints with Code #5 Constraints with Code #5 Constraint animation 제약에 Animation을 추가해 본다. // // AnimatingLayoutChangesViewController.swift // Constraints with Code Practice // // Created by Martin.Q on 2021/12/20. // import UIKit class AnimatingLayoutChangesViewController: UIViewController { @IBOutlet weak var pinkView: UIView! @IBOutlet weak var heightConstraint: NSLayoutConstraint! @IBOutlet weak var widthConstrai..
166. Constraints with Code #4 Constraints with Code #4 Align Center 사용할 Scene은 위와 같다. Label을 중앙에 배치하고, 파란색 View를 아래에 배치한다. 단, Label은 Intrinsic Size를 사용하도록 크기 제약은 추가하지 않는다. Label과 파란색 View의 간격은 10pt, 파란색 View의 높이는 5pt, 파란색 View의 너비는 Label의 너비와 같도록 제약을 추가한다. 추가된 모습은 위와 같다. NSLayoutConstraint로 제약 추가하기 func layoutWithInitializer() { label.translatesAutoresizingMaskIntoConstraints = false tealView.translatesAutoresizingMaskIntoCo..
165. Constraints with Code #3 Constraints with Code #3 Custom Header View 화면 상단에 View를 배치하고, 너비는 margin에 관계없이 모두 채울 수 있도록 제약을 추가한다. 높이는 100pt로 고정한다. Scene은 위와 같다. 추가되는 제약은 위와 같다. 이때 추가하는 대상은 Safe Area가 아닌 View로 설정해야 하고, Constrain to margins 속성은 비활성화해야 한다. 이렇게 추가하면 System UI의 영역까지 덮게 된다. 만약 System UI를 침범하지 않게 하려면 Safe Area를 기준으로 추가하면 된다. 변경하면 위와 같은 모습이 된다. // // CustomHeaderViewController.swift // Constraints with Code Practi..