티스토리 뷰

iOS에서 비동기 작업을 수행할 때 가장 많이 사용하는 방법은 GCD(Grand Central Dispatch) 다. 하지만, 보다 복잡한 작업을 제어하고 싶다면? 단순한 GCD만으로는 한계가 있을 수 있다.

예를 들어,

  • 작업 간의 의존성을 설정하고 싶다면?
  • 작업을 취소하거나 우선순위를 조정하고 싶다면?
  • 비동기 작업을 더 정교하게 관리하고 싶다면?

이런 경우에는 OperationQueue가 강력한 해결책이 될 수 있다.
이번 포스팅에서는 OperationQueue의 개념, 특징, 사용법 그리고 GCD와 비교하여 언제 사용하면 좋은지까지 알아보자! 

 


OperationQueue란?

OperationQueue는 비동기 작업을 관리하는 고급 API로, GCD보다 더 정교한 제어 기능을 제공한다.
이 API는 작업을 큐에 넣으면 자동으로 실행되며, GCD보다 더 많은 기능을 제공한다.

쉽게 말해, OperationQueue는 여러 개의 작업을 자동으로 실행하고,
우선순위와 의존성을 관리할 수 있는 시스템이다.

 


OperationQueue의 주요 특징

특징  설명
비동기 작업 관리 GCD처럼 큐에 작업을 추가하면 알아서 실행됨
작업의 취소 가능 실행 중이거나 대기 중인 작업을 취소할 수 있음
작업 간의 의존성 설정 가능 특정 작업이 끝난 후 다른 작업이 실행되도록 지정 가능
작업의 우선순위 조정 가능 중요한 작업을 먼저 실행하도록 설정 가능
최대 동시 실행 수 지정 가능 한 번에 실행할 최대 작업 개수 설정 가능

 


OperationQueue 기본 사용법

1. 기본적인 OperationQueue 사용

OperationQueue를 사용하려면 먼저 큐를 생성하고, 실행할 작업을 추가하면 된다.

let queue = OperationQueue()

queue.addOperation {
    print("작업 1 실행")
}

queue.addOperation {
    print("작업 2 실행")
}

결과: 작업 1, 작업 2가 비동기적으로 실행됨 (순서는 보장되지 않음)


2. 최대 동시 실행 작업 수 설정

한 번에 실행할 작업 수를 제한할 수도 있다.

let queue = OperationQueue()
queue.maxConcurrentOperationCount = 1 // 직렬(Serial) 실행

queue.addOperation { print("Task 1") }
queue.addOperation { print("Task 2") }
queue.addOperation { print("Task 3") }

maxConcurrentOperationCount = 1 로 설정하면 직렬 큐처럼 동작한다.
값이 크면 여러 작업이 동시에 실행된다.


3. 작업을 객체로 만들기 (Operation 상속)

OperationQueue에서는 작업을 Operation 클래스로 만들어 추가할 수도 있다.

 

Operation을 상속받아 커스텀 작업 만들기

class MyOperation: Operation {
    override func main() {
        if isCancelled { return } // 취소 가능하게 처리
        print("Custom Operation 실행 중")
    }
}

let queue = OperationQueue()
let operation = MyOperation()
queue.addOperation(operation)

Operation을 직접 만들어서 관리하면 작업을 더 세밀하게 제어할 수 있다.
isCancelled을 체크하면 작업을 취소할 수도 있다.


4. 작업 간의 의존성 설정

한 작업이 끝난 후 다음 작업을 실행하고 싶다면? addDependency()를 사용하면 된다.

let queue = OperationQueue()

let operation1 = BlockOperation {
    print("작업 1 실행")
}

let operation2 = BlockOperation {
    print("작업 2 실행")
}

operation2.addDependency(operation1) // 작업 1이 끝나야 작업 2 실행

queue.addOperations([operation1, operation2], waitUntilFinished: false)

operation2.addDependency(operation1) 를 추가하면
작업 1이 끝난 후 작업 2가 실행된다.


5. 작업 취소하기

OperationQueue에서는 실행 중이거나 대기 중인 작업을 취소할 수도 있다.

let queue = OperationQueue()

let operation = BlockOperation {
    print("이 작업은 실행되지 않을 수도 있음")
}

queue.addOperation(operation)

// 일정 시간이 지난 후 작업 취소
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
    operation.cancel()
}

operation.cancel()을 호출하면 작업이 시작되기 전에 취소될 수 있다.


OperationQueue vs. GCD 비교

비교 항목 GCD (DispatchQueue) OperationQueue
작업 추가 방식 클로저 기반 (async {}) Operation 객체 사용 가능
작업 취소 가능 여부 불가능 가능 (cancel())
작업 간 의존성 직접 구현해야 함 addDependency()로 간단하게 설정 가능
작업 우선순위 설정 qos로 설정 가능 queuePriority로 세밀한 설정 가능
최대 실행 개수 조절 X (직렬/병렬 큐만 설정 가능) maxConcurrentOperationCount로 조절 가능

언제 GCD를 사용하면 좋을까?

  • 단순한 비동기 작업이 필요할 때
  • 네트워크 요청, 파일 다운로드 등 간단한 백그라운드 작업을 실행할 때

언제 OperationQueue를 사용하면 좋을까?

  • 여러 개의 작업을 체계적으로 관리할 때
  • 작업 간의 의존성이 필요할 때
  • 작업을 취소하거나 우선순위를 조정할 필요가 있을 때

정리

  • OperationQueue는 GCD보다 더 정교한 비동기 작업 관리가 가능하다.
  • Operation 클래스를 사용하면 직접 작업을 정의하고, 실행을 제어할 수 있다.
  • addDependency()를 사용하면 작업 간의 실행 순서를 설정할 수 있다.
  • maxConcurrentOperationCount를 조절하면 작업을 직렬 또는 병렬로 실행할 수 있다.
  • cancel()을 사용하면 실행 중이거나 대기 중인 작업을 취소할 수 있다.

GCD는 간단한 비동기 작업을 처리할 때 유용하지만,
더 복잡한 작업 흐름이 필요할 때는 OperationQueue를 활용하면 더욱 강력한 제어가 가능하다

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함