본문 바로가기
iOS

[iOS] NSOperationQueue와 GCD Queue의 차이점

by thoonk: 2021. 1. 29.

NSOperationQueue와 GCD Queue의 차이점에 대해서 기록해보겠습니다.

 

iOS에는 멀티스레딩을 할 수 있는 두 가지 방법이 있습니다.

GCD(Grand Central Dispatch)는 C 기반의 low-level API이고 NSOperation은 Obj-C 기반으로 만들어진 high-level API가 있습니다.

 

NSOperationQueue

  • NSOperation 객체의 우선순위 및 준비 상태에 따라 대기열에 있는 객체를 실행한다. Operation Queue에 추가된 작업은 작업이 완료될 때까지 대기열에 남아 있다. 작업이 추가된 후에는 대기열에서 직접 제거할 수 없다.
  • 모든 작업이 끝나지 않은 상태에서 Operation queue를 중지시키면 메모리 릭이 발생할 수 있다.
  • GCD에서는 할 수 없는 기능들(재개, 취소, 중지)을 제공하지만 구현이 복잡하고 무겁다.
  • NSOperations, NSOperationQueue를 사용할 때 오버헤드가 발생한다.
  • KVO(Key-Value Observing) 사용이 가능하다. (GCD는 사용 불가)
    • operations (read only) : 현재 큐에 있는 작업들
    • operationCount (read only) : 현재 큐에 있는 작업의 개수
    • maxConcurrentOpeartionCount (readable and writable) : 큐에서 동시에 실행할 수 있는 작업의 최대 개수
    • suspended (readable and writable) : 실행 작업을 적극적으로 스케쥴링하고 있는지 여부에 대한 Boolean 값
    • name (readable and writable) : operationQueue의 이름
  • 작업 간의 의존성
    • 어떤 작업을 다른 작업이 성공적으로 수행된 후에 실행할 수 있게 하는 작업의 계층을 만들 수 있다.

GCD(Grand Central Dispatch) Queue (Dispatch Queue)

  • 동시성 모델을 매우 간단하게 사용할 수 있는 low-level C 기반 API
  • 앱의 메인 스레드 또는 백그라운드 스레드에서 작업의 실행을 직렬 또는 동시에 관리하는 객체이다.
  • 작업 항목을 동기 또는 비동기적으로 예약한다.
    • 동기적 : 여러 가지 작업을 순서대로 실행한다.
    • 비동기적 : 모든 동기 작업이 완료되기 전에 추가 스레드의 작업을 비동기로 실행해서 작업을 병렬적으로 수행하는 방식이다.
  • 메인 큐에서 작업 항목을 동기적으로 실행하면 교착 상태가 발생할 수 있다.

Conclusion

  • 하고자 하는 작업에 맞게 NSOperation Queue GCD Queue 적절하게 골라서 사용한다. 예를 들어, NSOperation Queue 기능들이 필요하다면 GCD 대신에 사용한다.

 

참조:

developer.apple.com/documentation/foundation/nsoperationqueue

developer.apple.com/documentation/DISPATCH

stackoverflow.com/questions/10373331/nsoperation-vs-grand-central-dispatch

 

 

'iOS' 카테고리의 다른 글

[iOS] Firebase와 Google 로그인 연동하기  (0) 2021.02.02
[iOS] Apple 로그인 구현  (2) 2021.02.01
[iOS] URLSession API  (0) 2021.01.21
[iOS] AppDelegate & SceneDelegate  (0) 2021.01.19
[iOS] App의 Life Cycle  (0) 2021.01.16

댓글