OperationQueue, GCD

박성민·2021년 1월 7일
0

iOS

목록 보기
7/30
post-custom-banner

NSOperationQueue 와 GCD Queue 의 차이점을 설명하시오.

NSOperationQueue

  • operation의 실행을 관리하는 큐
  • 준비 상태, 상호 운용 종속성, 우선 순위 등을 기반으로 실행한다.
    • 우선 순위가 같을 경우 먼저 큐에 들어 온 순서대로 처리
  • 큐에 한번 들어가면 작업이 완료되었다고 보고 할 때까지 대기열에 남아 있음
    • NSOperation의 finished가 true 일때
  • NSOperation의 작업 실행 과정
    ready → executing → finished
    state는 암묵적으로 해당 키패스에 KVO 통지를 하게됨. 이에 대응하는 프로퍼티가 true 반환
  • 작업 취소
    • 개체가 대기열에 남아 있지만 최대한 빨리 작업을 중지해야한다고 알림
    • 현재 작업이 실행 중일 경우 작업 개체의 state가 취소 상태를 확인하고 수행 중인 작업을 중지한 다음 완료됨으로 표시함
  • KVO을 사용해 작업 진행 사항 감시 가능

Grand Central Dispatch (GCD)

  • iOS에서 쉽고 편한 멀티 스레딩 처리를 위해 제공되는 api

  • 프로그래머가 실행할 태스크(작업)을 생성하고 Dispatch Queue에 추가하면 GCD는 태스크(작업)에 맞는 스레드를 자동으로 생성해서 실행하고 작업이 종료되면 해당 스레드를 제거

  • 앱의 기본 스레드 또는 백그라운드 스레드에서 작업 실행을 serial 또는 concurrent 방식으로 관리하는 개체

  • FIFO 방식으로 동작한다

  • 앱 실행시 시스템에서 기본적으로 2개의 Queue를 만들어 준다.

  1. Main Queue: 메인 스레드(UI 스레드)에서 사용 되는 Serial Queue로 모든 UI 처리는 메인 스레드에서 처리를 해야한다.
  2. Global Queue: 편의상 사용할수 있게 만들어 놓은 Concurrent Queue로 Global Queue는 처리 우선 순위를 위한 qos(Quality of service) 파라미터 제공하여 병렬적으로 동시에 처리를 하기때문에 작업 완료의 순서는 정할수 없지만 우선적으로 일을 처리하게 할수 있다.

GCD VS OperationQueue
Operation Queue

  • 비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용하는 데 적합합니다.
  • KVO(key Value Observing)를 사용해 작업 진행 상황을 감시하는 방법이 필요할 때도 적합합니다.
  • 동시에 실행할 수 있는 Operation의 최대 수를 지정할 수 있습니다.
  • Operation을 일시 중지, 다시 시작 및 취소를 할 수 있습니다.
    GCD
  • 작업이 복잡하지 않고 간단하게 처리하거나 특정 유형의 시스템 이벤트를 비동기적으로 처리할 때 적합합니다. (예를 들면 타이머, 프로세스 등의 관련 이벤트입니다.)
  • 오버헤드가 있지만 사용하기 매우 간편

GCD API 동작 방식과 필요성에 대해 설명하시오.

동작 방식

해야 할 일(코드)을 Operation으로 Wrapping한 다음에, Queue에 넣는다. Queue에서 남는 스레드에 작업을 배분한다.

Serial, Concurrent, sync, async

Serial과 Concurrent의 차이는 직렬 Queue와 병렬 Queue의 차이를 가집니다.

  • sync : 큐에 작업을 추가한 후, 추가된 작업이 종료될 때 까지 기다립니다. sync의 경우 하나의 작업이 Queue에서 빠져나갈 때까지 기다리기 때문에, Serial 이냐 Concurrent냐의 차이는 없습니다. sync로 모든 작업을 Queue에 넣을 경우 그 순서가 보장됩니다.
  • async : 큐에 작업을 추가하고, 이 작업의 완료 여부와 관계없이 다음 명령을 실행합니다.

필요성

  • 이미지 다운로드와 같이 오래 걸리는 작업을 동기로 처리하게 되면 해당 작업이 끝날때까지 화면이 멈추게 됨. 따라서 비동기로 백그라운드에서 동시에 작업을 처리해주는 것이 필요함
  • 기존에 스레드를 사용하려면 개발자가 직접 스레드를 생성하고 관리해야 했다. GCD를 사용하면 스레드 생성, 유지, 삭제 등을 개발자가 신경쓸 필요 없이 해야할 작업(코드)를 큐에 예약하기만 하면 된다.

Global DispatchQueue 의 Qos 에는 어떤 종류가 있는지, 각각 어떤 의미인지 설명하시오.

Concurrent하게 작업을 처리하면서 작업의 우선 순위를 지정하기 위해 사용합니다.

  • userInteractive : 중요도가 높고 즉각적인 반응이 요구되는 작업으로 즉각적으로 작업이 처리됩니다. UI업데이트나 이벤트 핸들링 등에 사용됩니다.
  • userInitiated : 빠른 결과를 기대할 때 사용하는 QoS
  • utility : 계산, I/O, 네트워킹 등 시간이 다소 오래 걸리는 작업입니다.
  • background : 유저가 인지하지도 못하는 뒷단에서 실행되는 작업입니다.

참고 및 출처

.

profile
iOS시작~
post-custom-banner

0개의 댓글