관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] GCD(Grand Central Dispatch) 본문

Git, CocoaPods, Xcode, Shell

[iOS - Swift] GCD(Grand Central Dispatch)

jake-kim 2020. 6. 29. 20:39

* Sync vs Async vs Serial vs Concurrent 개념: https://ios-development.tistory.com/589

1. Concurrency

"time-slicing" : iOS에서 각 쓰레드는 병렬적으로 동시에 실행 가능

 

Concurrency

single core device에서는 위 그림과 같이 Thread하나로 "context switch"를 하면서 동작

multicore device에서는 위 그림과 같이 Thread여러개로 "Parallelism"으로 동작

2. GCD

1) 개념

GCD는 쓰레드의 최상위에 만들어지는 것, GCD는 공유된 Thread pool을 관리 하는 것 (Dispatch queue를 가지고 쓰레드의 실행을 결정)

 

2) Thread-safe

Dispatch queue들은 Thread-safe함 (다수의 Threads들이 한 곳에 동시에 접근 가능하다는 의미)

* Re-entrancy : 하나의 일에 대해서 부분적으로 실행

* Mutual exclusion(Mutex) : 공유된 데이터에 대해서 오직 하나만의 Thread만 일거나 쓸수 있는 것

* Thread-local storage : 변수들은 지역화되어 있기 때문에 Thread는 private copy를 갖음

* Atomic operations(lock의 매커니즘) : 공유된 데이터는 atomic 연산자에 의해서 처리됨 (다른 Thread에 의해서 interrupted되지 않음),,, 다른 Thread가 접근해도 safe한 이유

 

3) Queue

GCD는 dispatch queue들을 DispatchQueue라는 것을 통해 명령

GCD는 queue를 이용하여 작업들을 FIFO(First In, First Out)으로 실행

 

(1) Serial Queue

오직 한 task를 주어진 시간동안 실행 시키는 것을 보장

Serial Queue

 

(2) Concurrent queue

동시에 miltiple task를 실행할 수 있음

Concurrent Queue

3. GCD's Queue

1) Main Queue : main thread인 serial queue사용

2) Global Queue : concurrent queue들은 전체적인 시스템에 의해서 공유됨 (4가지의 queue존재)

 - high

 - default

 - low

 - background(가장 우선순위가 낮은 큐)

3) Custom Queue : serial or concurrent 큐를 생성

4. QoS(Quality of Service) class

task의 우선순위를 의미하며, GCD를 관리
1) .userInteractive (in Main Thread) : 곧바로 UX에 제공해야 하는 중요한 일(UI updates,,, 이벤트 update)

 

2) .userInitiated (in Global Queue) : 사용자가 UI와 같은 급박한 결과를 기다리는 일

 

3) .utility (in Global Queue) : long-running task (progree indicator, I/O, N/W), energy efficient

 

4) .background : 사용자가 곧바로 느낄 수 없을 정도의 일

 

* 기타

- .default : 2)번과 3)번사이

 

ex)

// 1
DispatchQueue.global(qos: .userInitiated).async { [weak self] in
  guard let self = self else {
    return
  }
  let overlayImage = self.faceOverlayImageFrom(self.image)

  // 2
  DispatchQueue.main.async { [weak self] in
    // 3
    self?.fadeInNewImage(overlayImage)
  }
}

5. Synchronous vs Asynchronous

1) Synchronous function

 task가 끝난 후에 caller에게 반환 : DispatchQueue.sync(execute:)

 

2) Asynchronous function

 task가 끝나는 것일 기다리지 않고 즉시 task시작 : DispatchQueue.async(execute:)

 

* task를 관리하는 방법

- closure사용(self-contained되어 있고 around의 코드를 부를 수 있는 것)

6. Delaying Task

.asyncAfter(deadline:) {클로저}

// 1
let delayInSeconds = 2.0

// 2
DispatchQueue.main.asyncAfter(deadline: .now() + delayInSeconds) { [weak self] in
  guard let self = self else {
    return
  }

  if PhotoManager.shared.photos.count > 0 {
    self.navigationItem.prompt = nil
  } else {
    self.navigationItem.prompt = "Add photos with faces to Googlyify them!"
  }

  // 3
  self.navigationController?.viewIfLoaded?.setNeedsLayout()
}

* 심화- GCD barriar queue 개념: https://ios-development.tistory.com/588

Comments