[iOS] Concurrency - GCD, NSOperation

Zoe·2023년 12월 26일
0

iOS

목록 보기
37/39

NSOperationQueue와 GCD Queue는 멀티스레딩과 비동기 작업을 처리하기 위한 방법들이다.

예시와 함께 차이점에 대해 알아보자.

//NSOperationQueue
import Foundation

class MyOperation: Operation {
    override func main() {
        if isCancelled { //isCancelled를 확인하여 작업이 취소된 경우 실행을 중단
            return
        }
        print("Operation executed")
    }
}

let queue = OperationQueue()

let op1 = MyOperation()
let op2 = MyOperation()

op2.addDependency(op1) // op2는 op1이 완료된 후에 실행

queue.addOperation(op1)
queue.addOperation(op2)
  • op1과 op2라는 MyOperation 인스턴스를 생성

  • op2.addDependency(op1) : op2 작업이 op1 작업이 완료된 후에 실행되도록 설정. 즉, op1이 완료되기 전까지는 op2가 시작되지 않음

  • Queue에 작업 추가: queue.addOperation(op1)과 queue.addOperation(op2)는 작업을 OperationQueue에 추가. queue는 작업을 관리하고 실행.

작업의 의존성, 우선순위, 준비 상태, 취소 등을 관리한다. 한 작업이 다른 작업이 완료된 후에 실행되도록 설정하거나, isCancelled 속성을 확인하여 작업 실행 중에 취소 여부를 확인하는 등의 기능을 제공한다.

//GCD Queue
import Foundation

let serialQueue = DispatchQueue(label: "com.example.serialQueue")
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

serialQueue.async {
    print("First task executed")
}

concurrentQueue.async {
    print("Second task executed")
}
  • serialQueue : 연속적으로 작업을 실행. 이 큐에 추가된 작업들은 순차적으로, 하나씩 실행

  • concurrentQueue : 병렬로 작업 실행. 이 큐에 추가된 작업들은 동시에 실행됨.

GCD는 낮은 수준의 API를 통해 세밀한 제어가 가능하다.

GCD API

GCD는 작업을 관리하기 위헤 Dispatch Queues를 사용한다.

  • Serial Queues: 한 번에 하나의 작업만 실행. 큐에 추가된 순서대로 작업이 실행됨.
  • Concurrent Queues: 복수의 작업을 동시에 실행할 수 있음. 작업은 추가된 순서대로 시작되지만, 완료는 동시에 이루어질 수 있음.

작업은 비동기적(asynchronous) 또는 동기적(synchronous)으로 큐에 추가될 수 있다.

  • 비동기(Asynchronous): 작업을 큐에 추가한 후, 해당 작업이 완료되기를 기다리지 않고 즉시 반환.
  • 동기(Synchronous): 작업이 완료될 때까지 기다림
import Foundation

// 시리얼 큐 생성
let serialQueue = DispatchQueue(label: "com.example.serialQueue")

serialQueue.async {
    // 비동기 작업
    for i in 0..<5 {
        print("Serial Queue Async \(i)")
    }
}

serialQueue.sync {
    // 동기 작업
    for i in 5..<10 {
        print("Serial Queue Sync \(i)")
    }
}

시리얼 큐를 생성하고, 비동기 및 동기 방식으로 작업을 추가. 비동기 작업은 큐에 추가된 후 즉시 제어가 반환되며, 동기 작업은 작업이 완료될 때까지 현재 스레드를 차단.

// 동시 큐 생성
let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

concurrentQueue.async {
    // 비동기 작업
    for i in 0..<5 {
        print("Concurrent Queue Async \(i)")
    }
}

concurrentQueue.sync {
    // 동기 작업
    for i in 5..<10 {
        print("Concurrent Queue Sync \(i)")
    }
}

동시 큐는 여러 작업을 동시에 실행

QoS

작업의 중요도와 실행 우선 순위를 시스템에 알려준다.

User Interactive

  • DispatchQoS.userInteractive
    : 즉각적인 사용자 상호작용이 필요한 작업. 예를 들어, 애니메이션 또는 UI 업데이트와 같이 사용자가 직접 대기하는 작업이 이에 해당
    이는 가장 높은 우선 순위를 가지며, 지연 없이 즉시 실행되어야 하는 작업에 적합

User Initiated

  • DispatchQoS.userInitiated
    : 사용자가 결과를 기다리고 있고, 즉시 필요하지만 상호작용을 직접 차단하지 않는 작업에 사용. 예를 들어, 문서 열기, 사용자가 클릭한 결과 로딩 등이 해당.
    가능한 한 빨리 완료되어야 하며, 중요도가 높음.

Utility:

  • DispatchQoS.utility
    시간이 오래 걸리거나 CPU 사용량이 높은 작업에 적합. 예를 들어, 데이터 다운로드, 계산 집약적인 작업, 파일 읽기/쓰기 등.
    중간 수준의 우선 순위를 가지며, 사용자에게 직접적으로 보이지 않는 작업.

Background:

  • DispatchQoS.background
    : 사용자에게 즉각적으로 인식되지 않는 작업에 사용. 예를 들어, 데이터베이스 유지보수, 로그 작성, 데이터 동기화 등.
    이는 가장 낮은 우선 순위를 가지며, 시스템 리소스를 최소화하면서 실행.

Default:

  • DispatchQoS.default
    : 특별한 QoS가 지정되지 않았을 때 사용되는 기본 클래스. 시스템에서 알맞은 QoS를 결정하게 함.
profile
iOS 개발자😺

0개의 댓글

관련 채용 정보