[iOS] NSOperation 과 GCD(Grand Central Dispatch), DispatchQueue

Bibi·2022년 1월 26일
0

[iOS] NSOperation 과 GCD(Grand Central Dispatch), DispatchQueue

https://babbab2.tistory.com/65?category=831129

iOS 에서 제공하는 멀티스레딩을 위한 API에는 세 종류가 있다.

  • NSOperation (OperationQueue)
  • NSThread (Thread)
  • GCD (Grand Central Dispatch) - (DispatchQueue)

NSOperation (NSOperationQueue)

Objective-C 기반의 고수준 API

  • 내부적으로 C 로 구현된 GCD 를 고수준 언어로 래핑한 것.
  • 장점) GCD 에 없는 기능들을 사용할 수 있음
    • 작업 취소, 작업 재사용, KVO 등
  • 단점) GCD 보다 무겁고, 오버헤드 발생
  • 동작 방식 : NSOperationNSOperationQueue 에 추가하여 실행

GCD (Grand Central Dispatch) - DispatchQueue

  • 내부적으로 C로 구현됨
  • 장점) NSOperation 보다 가볍고 성능이 좋음, 클로저로 구현되어 있어 코드 가독성이 좋음, 간단하게 사용 가능
  • 단점) 몇몇 기능을 직접 구현해 주어야 함 - 작업 취소, 작업 재사용, KVO 등
  • 동작 방식 : DispatchQueue 를 사용

DispatchQueue

GCD 에선 DispatchQueue를 통해 작업을 관리한다.

DispatchQueue 에는 두 가지 타입이 존재한다. - Serial Queue, Concurrent Queue

  • Serial Queue
    • 작업을 순차적 처리. 한 번에 하나의 작업만 처리
  • Concurrent Queue
    • 동시에 여러 개의 작업 처리.

DispatchQueue 는 애플리케이션 실행과 동시에 2개의 큐가 자동 생성된다. - Main Queue, Global Queue

  • Main Queue (Serial Queue)

    • public class var main: DispatchQueue { get }

    • 메인 스레드에서 사용되는 Queue.

    • UI 관련 작업을 이곳에서 처리해야 함

    • Main Queue 에 작업을 추가하고 싶다면 아래와 같이 할 수 있다

      • DispatchQueue.main.async {
           // 원하는 작업
          // DispatchQueue 중 main queue 에 async 로 작업을 추가하겠다는 의미.
        }
    • Main Queue 에는 절대 Sync Task 를 추가할 수 없음 - 메인 스레드가 Thread-Safe 하지 않기 때문. (main.sync : 런타임 에러)

  • Global Queue (Concurrent Queue)

    • public class func global(qos: DispatchQoS.QoSClass = .default) -> DispatchQueue

    • 편의상 사용할 수 있게 만들어져 있는 Concurrent Queue 이다.

    • QoS 를 지원한다 : 우선 순위(priority)를 직접 명시할 수 있음

    • Global Queue 에 작업을 추가하고 싶다면 아래와 같이 할 수 있다

      • DispatchQueue.global().sync {
          // 원하는 작업
          // DispatchQueue 중 global queue 에 sync 로 작업을 추가하겠다는 의미
        }
        
        DispatchQueue.global().async {
          // 원하는 작업
          // DispatchQueue 중 global queue 에 async 로 작업을 추가하겠다는 의미
        }
        
        DispatchQueue.global(qos: .userInteractive).sync {
           // 원하는 작업
           // 이와 같이 QoS 를 직접 지정할 수도 있다.
        }

0개의 댓글