[iOS] NSOperation, NSOperationQueue, GCD

nnnyeong·2022년 9월 5일
0

iOS

목록 보기
15/17
  • iOS에는 멀티스레딩을 할 수 있는 두 가지 방법이 존재함
  • GCD(Grand Central Dispatch) : C 기반의 low-level API
  • NSOperation : Obj-C 기반으로 만들어진 high-level API

NSOperation

  • Operation은 하나의 작업 단위
  • OperationQueue는 이 Operation들의 스케쥴링과 실행을 담당
    • Operation이 담겨 Queue처럼 FIFO으로 동작
    • 더 높은 우선순위의 작업이 들어오게 되면 낮은 우선순위보다 빠르게 실행되는 우선순위큐 형식
  • 때문에 Operation에는 우선순위를 비롯한 정보가 담겨있어야 함



NSOperation 의 메소드들

1. addDependency(_:)

  • 다른 Operation에 Dependency를 가짐
  • 현재 operation보다 매개변수의 Operation이 더 먼저 완료되어야 하는경우 사용
  • addDependency 가 있다면 당연히 removeDependency(_:) 도 존재
  • operation.dependencies 프로퍼티의 경우 operation에 의존성이 있는 작업을 배열 형식으로 얻을수 있습니다.

2. queuePriority

Queue 안에서의 Priority. (get, set)

enum NSOperationQueuePriority : Int {
case VeryLow
case Low
case Normal
case High
case VeryHigh
}

start

  • operation 실행

completionBlock( ( ) -> Void )

  • operation이 끝나고 수행할 작업 지정 ( completionHandler 느낌 )

cancel

  • operation 중간에 실행 종료

여러가지 operation의 프로퍼티가 있는데, 이를 단독으로 사용하는경우는 효용이 많지는 않기 때문에 OperationQueue와 함께 사용해서 queue를 제어하는것이 operation을 직접 제어하는것 보다 권장된다. 또한, 위를 UIKit과 연관해서 사용하기에는 MainThread에서 수행되는 보장이 없으므로 UI를 그릴때 사용하는것은 권장되지 않는다.




NSOperationQueue

OperationQueue는 병렬 dispatch queue와 동등하고 NSOperationQueue 클래스로 구현된다. 실행할 작업을 정하고 operation queue에 추가하기만 하면 시스템이 스레드를 관리해준다.

GCD는 항상 FIFO로 작업 실행하지만 operation queue는 작업 실행 순서 결정할때 다른 요소들도 고려한다. 고려하는 요소 중 가장 중요한 것은 수행되려는 작업이 다른 작업의 완료에 연관이 있는지 종속성을 고려하는 것이다.

작업에 필요한 데이터를 캡슐화한 작업 객체는 Key-Value Observing(KVO) 알림을 생성하여 작업 진행 상황을 모니터링할 수 있다. Operation queue는 항상 작업을 동시에 실행하지만 종속성을 사용할 땐 순서에 맞게 실행할 수도 있다.

  • NSOperation 객체의 우선 순위 및 준비 상태에 따라 대기열에 있는 객체를 실행한다.
  • Operation Queue에 추가된 작업은 작업이 완료될때까지 대기열에 남아있다.
  • 작업이 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 Queue

GCD는 스레드 관리 코드를 시스템이 하게끔 하여 개발자는 실행할 작업을 정의하고 dispatch queue에 넣기만 하면 되도록 한다. 즉 멀티쓰레딩을 위해 Apple에서 개발한 기술로 스레드 관리와 실행에 대한 책임을 애플리케이션 레벨에서 운영체제 레벨로 넘겼다.

Dispatch queue는 작업 동시에 순차적으로 실행하며 FIFO 방식으로 실행한다. Dispatch queue는 serial 방식과 Concurrent방식이 있다. 작업 단위는 Block, 스위프트에선 Closure라 불리며 DispatchQueue가 이 Block을 관리한다.

GCD는 각 애플리케이션에서 생성된 DispatchQueue를 읽는 멀티코어 실행 엔진을 가지고 있으며 이것이 Queue에 등록된 각 작업을 꺼내 쓰레드에 할당하고 개발자는 내부 동작을 자세히 알 필요 없이 Queue에 작업을 넘기기만 하면 되서쓰레드를 직접 생성하고 관리하는 것에 비해 관리 용이성과 이식성, 성능이 증가하게 되었다.




Reference

[Swift] Operation(NSOperation)이란?
[iOS] Operation과 OperationQueue (NSOperation, NSOperationQueue)
[iOS] Operation과 GCD
공식문서 - NSOperationQueue
공식문서 - NSOperation

profile
주니어 개발자까지 ☄️☄️

0개의 댓글