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는 작업을 관리하기 위헤 Dispatch Queues를 사용한다.
작업은 비동기적(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)")
}
}
동시 큐는 여러 작업을 동시에 실행
작업의 중요도와 실행 우선 순위를 시스템에 알려준다.