Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Protocol
- rxswift
- 리펙터링
- combine
- 스위프트
- clean architecture
- 리펙토링
- tableView
- Clean Code
- SWIFT
- 리팩토링
- collectionview
- Observable
- UITextView
- ribs
- swiftUI
- RxCocoa
- Refactoring
- UICollectionView
- uitableview
- 클린 코드
- Human interface guide
- 애니메이션
- ios
- HIG
- Xcode
- MVVM
- swift documentation
- map
- uiscrollview
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] Dispatch Group 본문
* Dispatch Queue 개념 먼저 확인: ios-development.tistory.com/138
GCD의 개념
- GCD(Grand Central Dispatch)는 iOS에서 thread pool(생성된 Thread들)을 관리하는 개념
- Dispatch Queue: Thread safe하게 Thread들을 관리할 수 있는 도구
- Queue의 종류에는 크게 두 가지 존재: Serial Queue, Concurrent Queue
- Seirial Queue: Main Queue
- Concurrent Queue: Global Queue - Task의 종류에는 크게 두 가지 존재: sync, async
- QoS(Quality of Service): 우선순위 결정
Dispatch Group 기본 개념
- DispatchQueue들을 그룹으로 묶어서, 후행 클로저 (일이 끝난다음의 처리)를 할 수 있도록 하는 것
- 서로 다른 성격의 Queue들을 하나의 그룹으로 묶는 것도 가능
let queue1 = DispatchQueue(label: "queue1", attributes: .concurrent)
let queue2 = DispatchQueue(label: "queue2", attributes: .concurrent)
let group = DispatchGroup()
queue1.async(group: group) {
for i in 0...5 {
print(i)
}
}
queue2.async(group: group) {
for i in 100...105 {
print(i)
}
}
let queueForGroup = DispatchQueue(label: "queue3", attributes: .concurrent)
group.notify(queue: queueForGroup) { // group이 끝난 후 후행 클로저를 실행할 queue삽입
print("끝")
}
- 결과
Dispatch Groupd 핵심 개념
- enter(): Dispatch Group에 들어가며, task를 +1
- leave(): Dispatch Group에서 나오며, task를 -1
- notify(): task가 0이 되었을 때 실행
Dispatch Group 활용 - 코드 실행 순서 정의
* DispatchQueue.main.async 블록 안에서 A실행 후 B실행을 보장하기 위한 방법
- DispatchQueue.main.async 그룹
DispatchQueue.main.async {
}
- DispatchGroup() 객체 생성
DispatchQueue.main.async {
let waitGroup = DispatchGroup()
}
- enter() 함수 호출 - A 선행 실행을 알림
DispatchQueue.main.async {
let waitGroup = DispatchGroup()
waitGroup.enter()
print(A)
}
- leave() 함수 호출 - 실행이 끝났다는 것을 알림
DispatchQueue.main.async {
let waitGroup = DispatchGroup()
waitGroup.enter()
print(A) {
waitGroup.leave()
}
}
- notify(queue:) 함수 호출 - B 후행 실행 시작을 알림
DispatchQueue.main.async {
let waitGroup = DispatchGroup()
waitGroup.enter()
print(A) {
waitGroup.leave()
}
waitGroup.notify(queue: DispatchQueue.main) {
print(B)
}
}
Dispatch Groupd 활용 예제)
- 여러 애니메이션이 끝났을 때, 자동으로 modal view를 띄우고 싶은 경우
- code
let animationGroup = DispatchGroup()
// enter
animationGroup.enter()
UIView.animate(withDuration: 1.5) {
self.view1.backgroundColor = .blue
} completion: { _ in
// leave
animationGroup.leave()
}
// enter
animationGroup.enter()
UIView.animate(withDuration: 3) {
self.view2.backgroundColor = .green
} completion: { _ in
// leave
animationGroup.leave()
}
// notify
animationGroup.notify(queue: .main) {
self.performSegue(withIdentifier: "nextSceneSegue", sender: nil)
}
- 전체 source code: https://github.com/JK0369/dispatchGroup_sample
'iOS 기본 (swift)' 카테고리의 다른 글
[iOS - swift] if case let, guard case let (0) | 2020.12.30 |
---|---|
[iOS - swift] POP(Protocol Oriented Programming) 프로토콜 지향 프로그래밍 (0) | 2020.12.23 |
[iOS - swift] class var vs static var (0) | 2020.11.29 |
[iOS - swift] run타임에서 디버깅 방법, 콘솔창에서 print (break point, po) (0) | 2020.11.26 |
[iOS - swift] Designated init, Convenience init, 초기화의 핵심, 초기화 상속 (0) | 2020.11.26 |
Comments