티스토리 뷰
(Ray wenderlich - Grand Central Dispatch Tutorial for Swift 4: Part 1/2 번역)
Part 1.
- GCD가 등장한 개요와 GCD를 이해하기 위한 기초적 개념들 그리고 GCD에 대해 간단히 알아보았다.
파트 1 링크 : (https://atelier-chez-moi.tistory.com/43)
Part 1에 이어..
- GCD는 Queue 의 3가지 주요 타입을 제공합니다.
1. Main queue : 메인 스레드에서 작동하며 'Serial Queue'.
2. Global Queues : 전체 시스템에 의하여 공유되는 'Concurrent Queues'.
3. Custom Queues : 사용자가 Serial 혹은 Concurrent 로 입맛에 맞게 생성하는 Queues.
이러한 Queue 들의 요청은 실제로 Global Queues 의 하나에서 종료된다.
(이 부분 잘 아시는분 댓글 부탁드립니다)
* 복습 : Queue 에 작업 단위를 제출하면 GCD 는 이 작업 단위를 FIFO(First In First Out) 의 순서로 실행.
- global concurrent queues 에 작업을 보낼 때, 우리는 우선순위를 직접 명시하지 않습니다.
대신에, 'Quality of Service (QoS)' 클래스 프로퍼티로 명시합니다.
이 프로퍼티는 작업의 중요성을 나타내며 GCD가 작업에 줄 우선순위를 결정하는데 가이드를 제공합니다.
- QoS 클래스는 다음과 같습니다
1. User-interactive
* 이 클래스는 나이스한 유저 경험을 제공하기 위해 즉시 끝내야만 하는 작업에 해당합니다.
* 'UI 업데이트', '이벤트 핸들링', '저수준의 레이턴시(low latency)'를 요구하는 작은 작업량(small workloads)'에 사용하세요.
* 전체 작업량은 우리 앱의 실행 중에 이 클래스에서 행해지는 전체 작업의 양은 스몰하게 해야 합니다.
* 이 클래스는 메인 스레드에서 작동합니다.
2. User-initiated
* 사용자는 UI에서 이러한 비동기 작업들(Asynchronous tasks)을 시작합니다.
* 사용자가 즉각적인 결과와 사용자 상호 작용을 계속하기 위해 필요한 작업을 기다리고 있을 때 이 비동기 작업을 사용하세요.
* 이 작업은 높은 우선 순위의 global queue 에서 실행됩니다.
3. Utility
* 이 클래스는 보통 사용자에게 보여지는 진행 인디케이터와 함께 오랜 시간 작동하는 작업(long-running tasks)에 해당합니다.
* 계산(computations), I/O, 네트워킹, 계속되는 데이터 피드(continuous data feeds), 유사 작업(similar tasks) 에 사용하세요.
* 이 클래스는 에너지 효율을 위해서 디자인되었습니다.
* 이 클래스는 낮은 우선순위의 global queue 에 매핑됩니다.
4. Background
* 이 클래스는 유저가 직접적으로 인지하지 못하는 작업에 해당합니다.
* 프리페칭(prefetching), 유지(maintenanace) 그리고 사용자 상호작용이 필요하지 않고 시간에 구애받지 않는 작업에 사용하세요.
* 이 클래스는 background 우선순위의 global queue 에 매핑됩니다.
(This will get mapped into the background priority global queue.)
동기(Synchronous) vs 비동기(Asynchronous)
- GCD를 이용하여, 우리는 작업을 동기적 혹은 비동기적으로 보낼 수 있어요.
- Synchronous 함수는 작업이 끝난 후에 호출자에게 통제권을 리턴해요..
(A synchronous function returns control to the caller after the task completes.)
'DispatchQueue.sync(execute:)' 를 호출함으로서 동기적으로 작업의 단위를 스케쥴링할 수 있어요.
(You can schedule a unit of work synchronously by calling.)
(+ Synchronous 보충 정리)
- 작업중인 스레드의 다른 작업들은 모두 일시 정지됩니다.
- 그래서 아무것도 못하고 멈춰 있기 때문에 앱이 렉이 걸리는 것처럼 보인다. 따라서 싱크는 잘 사용하지 않는다고 한다.
- 만약 Main 큐에서 동기 방식을 사용할 경우에는 '데드 락'이 발생하는데 위의 원인때문에 그러하다.
-------------------------------------------------------------------------------------------------------------
- Asynchronous 함수는 즉시 리턴하며, 순서화된 작업이 시작하더라도 그것이 끝나기를 기다리지는 않아요.
따라서 비동기 함수는 현재 실행 스레드가 다음 함수로 진행하는 것을 블로킹하지 않아요.
우리는 작업 단위를 비동기적으로 스케쥴링 할 수 있고 이는 'DispatchQueue.async(execute:)' 함수로 호출함으로서 가능하죠.
(+ Asynchronous 보충 정리)
- 비동기 처리 메소드를 통해 비동기적으로 실행되면, 즉시 메서드에서 return 을 호출하고 작업도 수행하게 된다.
--------------------------------------------------------------------------------------------------------------
(+ 짤막 정리 보충)
- 작업은 ‘동기(sync)’ 방식과 ‘비동기(async)’ 방식으로 실행 가능하지만 Main 큐에서는 ‘async’ 만 사용 가능
작업을 관리하기
- 작업을 클로저라고 간주해 봅시다. 클로저는 자기 자신이 포함된 호출 가능한 코드 블록이며 저장하거나 전달할 수 있습니다.
- Dispatch Queue 에 제출하는 각 작업은 'DispatchWorkItem' 입니다.
'DispatchWorkItem' 의 행위를 QoS 클래스나 새로 분리된 스레드를 생성할지 여부와 같이 설정할 수 있습니다.
이론적 부분에 대한 설명은 여기까지입니다.
댓글은 큰 힘이 됩니다. 틀린 부분 지적 감사드리겠습니다.
'Programming > iOS' 카테고리의 다른 글
iOS - Core Image tutorial(코어 이미지 튜토리얼) (2) (0) | 2019.05.08 |
---|---|
iOS - Core Image tutorial(코어 이미지 튜토리얼) (1) (3) | 2019.05.06 |
iOS - 초보자를 위한 Grand Central Dispatch (GCD) Part. 1 (0) | 2019.04.21 |
iOS - 앱 생명 주기(App Life Cycle), 실행 상태(Execution State) (0) | 2018.07.18 |
iOS - 코코아 터치 프레임워크(Cocoa Touch Framework) (0) | 2018.07.15 |
- Total
- Today
- Yesterday
- ios
- function
- ARC
- 딕셔너리
- var
- 프로그래밍
- OOP
- GCD
- Swift
- lifecycle
- inswag
- iOS개발스쿨
- Dictionary
- Operator
- commit
- swiftUI
- 컨버전
- array
- 타입
- 스위프트
- 리터럴
- 튜플
- fastcampus
- tca
- 깃허브
- 열거형
- 패스트캠퍼스
- 패캠
- fallthrough
- 개발스쿨
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |