Swift - GCD(4)

Jenny·2021년 11월 17일
1
post-thumbnail

Dispatch Group 개념

- 여러 쓰레드에 분배된 작업들의 종료 시점을 각각이 아닌 하나로 그룹 지어서 한번에 파악할수 있다.
- 서로 다른 성격의 Queue들을 하나의 그룹으로 묶는 것도 가능하다.
- 특정 그룹의 모든 작업의 완료 시점을 알기 때문에 활용 할수 있다.
사용 예 : 여러 애니메이션이 효과가 겹처 있을때, 애니메이션 작업이 모두 종료된 시점을 알고 싶을때

실행 코드


let queue = DispatchQueue(label: "queue1", attributes: .concurrent)
let queue2 = DispatchQueue(label: "queue2", attributes: .concurrent)

//MARK: 그룹 생성하기
let group = DispatchGroup()

//MARK: 큐로 보낼때, 어떤 그룹에 넣을것인지 정해주기
queue.async(group: group) {
    for i in 1...5 {
        print("num \(i)")
    }
}

//MARK: 큐로 보낼때, 어떤 그룹에 넣을것인지 정해주기
queue2.async(group: group) {
    for i in 6...7 {
        print("num \(i)")
    }
}


let queueForGroup = DispatchQueue(label: "queue3", attributes: .concurrent)

// MARK: group이 끝난후 실행할 Queue 삽입
group.notify(queue: queueForGroup) {
    print("----종료----")
}


동기적 DispatchGroup

- 어떤 이유로 그룹의 완료 알림에 비동기적으로 응답 할 수 없는 경우
- DispatchGroup에서 wait Method를 사용할수 있다.
- 모든 작업이 완료 될 때까지 현재 대기열(Queue)을 차단하는 동기적 방법
- wait 메서드는 MainQueue(메인쓰레드)에서는 사용하면 안된다.

실행 코드

let queueWait = DispatchQueue(label: "queue")
let queueWait2 = DispatchQueue(label: "queue2")

let groupWait = DispatchGroup()


queueWait.async(group: groupWait) {
    for i in 10...15 {
        print("wait \(i)")
    }
}
queueWait2.async(group: groupWait) {
    for i in 16...20 {
        print("wait \(i)")
    }
}

let runQueue = DispatchQueue(label: "runQueue")

groupWait.notify(queue:runQueue) {
    print("----끝----")
}

//MARK: - 그룹작업이 다 끝나야만 다음 작업을 할 수 있는 상황의 앱이라면 wait메서드를 이용하면 된다.
groupWait.wait(timeout: DispatchTime.distantFuture)

인프런 - iOS Concurrency(동시성) 프로그래밍, 동기 비동기 처리 그리고 GCD/Operation - 디스패치큐와 오퍼레이션큐의 이해

profile
"Jenny 있게 iOS 개발을 하며 대체 불가능한 인재가 되자"

0개의 댓글