티스토리 뷰

(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 클래스나 새로 분리된 스레드를 생성할지 여부와 같이 설정할 수 있습니다.

 

 

 

 

이론적 부분에 대한 설명은 여기까지입니다.

댓글은 큰 힘이 됩니다. 틀린 부분 지적 감사드리겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함