Swift - GCD(5)

Jenny·2021년 11월 23일
1

Dispatch WorkItem 개념

  • Dispatch WorkItem 이란?
    - Dispatch WorkItem(Class)는 Task를 캡슐화 하는데 사용합니다.
    - Dispatch WorkItem은 Closure 형태로 실제 Queue에서 실행을 합니다.

//MARK : DispatchWorkItem 생성
let item1 = DispatchWorkItem(qos: .utility) {
    print("task1 출력")
    print("task2 출력")
    print("task3 출력")
}
//MARK : DispatchWorkItem 생성
let item2 = DispatchWorkItem(qos: .utility) {
    print("task4 출력")
    print("task5 출력")
    print("task6 출력")
}

//MARK : Serial Queue 생성
let queue = DispatchQueue(label: "runQueue")

//MARK : Serial Queue에 WorkItem 작업 비동기 실행 
queue.async(execute: item1)
queue.async(execute: item2)
실행 결과

perform
- perform : 현재 쓰레드에서 작업을 동기적으로 실행합니다.
//MARK : DispatchWorkItem 생성
let item1 = DispatchWorkItem(qos: .utility) {
    for i in 0...5 {
        print("item 1 실행 \(i)")
    }
}

//MARK: DispatchWorkItem 작업을 동기적 실행
item1.perform()
실행 결과

  • Dispatch WorkItem 취소 기능
- Dispatch WorkItem cancel() 메서드를 사용하여 작업을 제거
- cancel 메서드는 현재 작업 항목을 비동기적으로 취소합니다.
//MARK: WorkItem1 생성
let item1 = DispatchWorkItem(qos: .utility) {
    print("cancel 작업 실행")
}

//MARK: WorkItem2 생성
let item2 = DispatchWorkItem(qos: .utility) {
    print("task4 출력")
    print("task5 출력")
    print("task6 출력")
}

//MARK: WorkItem1 cancel 메서드를 사용하여 작업 제거
item1.cancel()
let queue = DispatchQueue(label: "runQueue")

//MARK: Serial Queue에 WorkItem 작업을 비동기 실행
queue.async(execute: item1)
queue.async(execute: item2)
실행결과

  • Dispatch WorkItem 순서 기능
notify(queue: DispatchQueue, execute: DispatchWorkItem) 을 사용하여 현재 작업 항목이 완료된 후 지정된 작업 항목의 실행을 예약합니다.

//MARK: 실행 Queue(Concurrent 동시) 생성
let queue = DispatchQueue(label: "runQueue", attributes: .concurrent)

//MARK: WorkItem1 생성
let workItem1 = DispatchWorkItem(qos: .utility) {
    print("task1 작업 시작")
    print("task1 작업 완료")
}
//MARK: WorkItem2 생성
let workItme2 = DispatchWorkItem(qos: .utility) {
    print("task2 작업 시작")
    print("task2 작업 완료")
}

//MARK: notifiy를 사용하여 workItme1이 완료후 WorkItem2 실행
workItem1.notify(queue: DispatchQueue.global(), execute: workItme2)

//MARK: WorkItem1 Concurrent Queue에 비동기 실행
queue.async(execute: workItem1)
실행 결과

Concurrent Queue에 실행대고 불구하고 Serial Queue처럼 작업이 실행되는 이유는 notify가 WorkItem1의 작업이 끝난후에 WorkItme2를 실행할수 있기때문에 Serial Queue처럼 작업이 실행이 된다.
profile
"Jenny 있게 iOS 개발을 하며 성장해 나아가자"

0개의 댓글