Asyncronous

sun02·2021년 8월 26일
0

iOS

목록 보기
5/27

동기 vs 비동기

sync.png

동기식(sync)

: 프로그램을 순차적으로 실행하는 것으로 이전 프로그램이 완료될 때까지 다음 프로그램은 대기해야한다

비동기식(aynchronous)

: 프로그램을 병렬적으로 실행, 이전 프로그램이 완료되지 않아도 다음 프로그램 실행 가능

IOS에서 지원하는 동시성 프로그래밍

동시성 프로그래밍(concurrency)이란? 여러 개의 스레드가 번갈아가면서 실행되어 동시에 실행되는 것처럼 보이는 것.

GCD (Grand Central Dispatch) / Operation Queue / Thread 등
: 다른 스레드에서 오래걸리는 작업들이 비동기적으로 동작하도록 만들어줌

1. GCD

: 멀티코어와 멀티프로세싱 환경에서 최적화된 프로그래밍을 할 수 있도록 애플이 만든 것이다. 프로그래머가 실행할 작업을 Dispatch Queue에 추가하면 GCD가 작업에 맞는 스레드를 자동으로 생성해서 실행하고 스레드를 제거한다.

Dispatch Queue : 먼저 들어온게 먼저 나가는 순서로 실행되는 대기열

- 디스패치 대기열의 종류

  • Concurrency Distpach Queue
    : 시작된 작업이 완료될 때까지 기다리지 않고 가능한 많은 작업 진행
    concurrent.png
  • Serial Dispatch Queue
    : 한 번에 하나의 작업만 실행, 해당 작업이 대기열에서 제외되고 새로운 작업 시작될 때까지 기다림
    serial.png

- GCD 사용 방법

1) Main Queue : 메인스레드에서 작동하는 큐 (UI, 사용자 인터렉션 관련 처리)

DispatchQueue.main.async {
  //statements
}

2) Global Queue : 우선순위(Qos = Quality of Servie) 지정하여 작동하는 큐

  • userInteractive : 바로 수행되어야하는 작업
  • userInitiated : 거의바로, 사용자가 결과 기다리는 작업
  • default
  • utility
  • background : 사용자에게 당장 인식될 필요 없는 작업
DispatchQueue.global(qos : .background).async {
  //statement
}

3) Custom Queue : 직접 큐를 생성해서 관리하고 싶을 때

let concurrentQueue = DispatchQueue(label:“concurrent”, qos : .background, attributes: .concurrent) 
let serialQueue = DispatchQueue(label : “serial”, qos: .background)
  • 큐 두 개 같이 쓰고 싶을때
DispatchQueue.gloabal(qos:.background).async {
     //statement
 DispatchQueue.main.async {
     //statement
    }
}

-> GCD에서는 주로 백그라운드 큐에서 메인 큐로 이동하는 작업 많이 함.

2. Operation Queue

: GCD 기반으로 여러가지 기능이 추가된 대기열. Concurrent dispatch Queue 와 동일하게 동작하며 Operation Queue 클래스에 의해 구현된다.

  • 디스패치 대기열은 항상 FIFO로 작업을 실행하지만 연산대기열은 실행 순서를 결정할 때 다른 요인들도 고려한다.
OperationQueue.addOperation() {
  //statement <- 백그라운드에서 실행됨( 이때, UI와 관련된 코드는 메인스레드에서 작동해 야하기 때문에 작성할 수 없음)
}

UI와 관련된 코드를 작성해야하는 경우

OperationQueue.addOperation() {
//statement
   OperationQueue.main.addOperation {
    // UI statement
   }
}

GCD와 OperationQueue의 차이점

  • OperationQueue에서는 동시에 실행할 수 있는 연산의 최대 수 지정할 수 있다.
  • OperationQueue에는 KVO(Key Value Observing)을 사용할 수 있는 많은 프로퍼티들이 있다
  • OperationQueue는 Operation을 일시중지, 다시시작, 취소 가능

(Kvo : 다른 객체의 프로퍼티에 변화가 있을 때 해당 객체가 직접 알림을 받을 수 있게 하는 매커니즘. 앱의 응집력(cohesiveness)에 중요하다. 예를 들어, MVC디자인 패턴에서 model의 상태를 controller와 view의 상태와 통일 시켜줄 때 사용한다.)

결론

  • GCD : 작업이 복잡하지 않고 간단한 일 비동기적으로 처리할 때 적합하다
  • 연산 대기열 : 복잡한 일/진행하고 있는 일을 취소, 순서지정, 등 비동기적으로 실행해야하는 작업을 객체지향적인 방법으로 실행할 때 적합하다. 또한 KVO를 사용하여 작업진행상황을 감독할 필요가 있을 때에도 적합하다.

0개의 댓글