티스토리 뷰

DispatchWorkItem

수행할 작업에 컴플리션 핸들이나 의존성 실행을 연결하는 방법으로 캡슐화합니다.

Overview

디스패치 큐나 디스패치 그룹에서 작업을 캡슐화합니다.

 

perfome()

let workItem = DispatchWorkItem {
    print(Thread.current)
    for i in 1...10 {
        print("❤️", i)
    }
}

workItem.perform()

 

 

queue.async(execute:)

let serialQueue = DispatchQueue(label: "serialQueue")
let workItem = DispatchWorkItem {
    print(Thread.current)
    for i in 1...10 {
        print("❤️", i)
    }
}

serialQueue.async(execute: workItem)

 

queue.async(group:execute:)

let myGroup = DispatchGroup()
let serialQueue = DispatchQueue(label: "serialQueue")

let workItem = DispatchWorkItem {
    print(Thread.current)
    for i in 1...10 {
        print("❤️", i)
    }
}

serialQueue.async(group: myGroup) {
    print(Thread.current)
    for i in 1...10 {
        print("💚", i)
    }
}

myGroup.notify(queue: .main) {
    print("DONE - 1")
}

serialQueue.async(group: myGroup ,execute: workItem)

 

notify

let serialQueue = DispatchQueue(label: "serialQueue")
let workItem = DispatchWorkItem {
    print(Thread.current)
    for i in 1...10 {
        print("❤️", i)
    }
}

serialQueue.async(execute: workItem)

workItem.notify(queue: .main) {
    print("DONE")
}

 

 

wait

let serialQueue = DispatchQueue(label: "serialQueue")

let workItem = DispatchWorkItem {
    print(Thread.current)
    for i in 1...10 {
        print("❤️", i)
    }
}

serialQueue.async(execute: workItem)
print("#1")
workItem.wait()
print("#2")

 

.wait()를 호출하면 workItem이 끝날 때까지 print("#2")가 호출되지 않습니다.

workItem이 종료된 후 #2가 프린트되는 것을 볼 수 있습니다.

 

 

 

 


 

DispatchGroup

한 단위로 모니터하는 작업 그룹

Overview

그룹은 작업 목록을 종합하고 동작을 동기화할 수 있습니다.

여러 작업을 그룹에 연결하고 동일한 큐나 다른 큐에서 비동기식으로 실행하도록 계획할 수 있습니다.

모든 작업의 실행이 완료되면 그룹이 컴플리션 핸들러를 실행합니다.

모든 그룹의 작업이 실행을 종료할 때까지 동기적으로 wait할 수 있습니다.

 

아래 식을 보겠습니다.

let myGroup = DispatchGroup()
let serialQueue = DispatchQueue(label: "serialQueue")
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)

serialQueue.async(group: myGroup) {
    print(Thread.current)
            for i in 1...10 {
                print("❤️", i)
            }
}

serialQueue.async(group: myGroup) {
    print(Thread.current)
            for i in 1...10 {
                print("💚", i)
            }
}

myGroup.notify(queue: .main) {
    print("DONE - 1")
}

concurrentQueue.async(group: myGroup) {
    print(Thread.current)
            for i in 1...10 {
                print("💛", i)
            }
}


myGroup.notify(queue: .main) {
    print("DONE - 2")
}

serialQueue인 빨간 하트와 초록 하트는 순차적으로 실행됩니다.

concurrentQueue인 노란 하트는 시리얼 큐와 관계없이 실행됩니다.

notify는 DispatchGroup이 모두 끝나고 나서 호출됩니다.

그래서 하트가 모두 나오고 DONE - 1과 DONE - 2가 마지막에 출력됩니다.

 

 

 

 

 

 

 

developer.apple.com/documentation/dispatch/dispatchworkitem

 

Apple Developer Documentation

 

developer.apple.com

 

developer.apple.com/documentation/dispatch/dispatchgroup

 

Apple Developer Documentation

 

developer.apple.com

 

댓글
공지사항