< 알바생 예시 >
한 명이 다 일하는 경우 ⇒ 동기(synchronous)
여럿이 나누어 일하는 경우 ⇒ 비동기(asynchronous)
매니저(큐)가 잘 관리하는 경우 ⇒ 동시(Concurrent)
매니저가 귀찮다! → 한명한테 다 주는 경우 ⇒ 직렬(Serial)
Swift Concurrnecy 구현 방법?
- GCD - 이전부터 쭉 잘 사용되어옴! (중지/재개 구현은 조금 어려움)
- OperationQueue - 중단/재개 등 기능들 더 잘 구현하기 위해 나옴! (내부적으로는 GCD 기반)
- Async/Await - 재작년(?)에 나옴.. 최소 버전 iOS 13
각각 하나씩 버튼을 만들어놓고 실습함
- Serial(Main) / Sync
@IBAction func serialSync(_ sender: UIButton) {
print("START", terminator: " ")
for i in 1...100 {
print(i, terminator: " ")
}
DispatchQueue.main.sync { // 본인이 해야하므로 무한 대기 상태에 들어감 -> 교착 상태 Deadlock
for i in 101...200 {
print(i, terminator: " ")
}
}
print("END")
}
- Serial(Main) / Async - 일 보내놓고 바로 다음 작업 → UI
@IBAction func serialAsync(_ sender: UIButton) {
print("START", terminator: " ")
DispatchQueue.main.async {
for i in 1...100 {
print(i, terminator: " ")
}
}
for i in 101...200 {
print(i, terminator: " ")
}
print("END")
}
// START 101 102 ... 200 END \n 1 2 3 4 ... 100
- global / sync - 여러 스레드에 분배, 기다렸다가 실행
@IBAction func globalSync(_ sender: UIButton) {
print("START", terminator: " ")
DispatchQueue.global().sync {
for i in 1...100 {
print(i, terminator: " ")
}
}
for i in 101...200 {
print(i, terminator: " ")
}
print("END")
} // 순서대로 출력
- → Main thread에서 동작하는 것과 똑같음.. 어차피 나눠줘도 똑같이 기다려야 하므로 걸리는 시간은 같음. 의미없음!
- global / async → 네트워크 통신
@IBAction func globalAsync(_ sender: UIButton) {
print("START", terminator: " ")
for i in 1...100 {
DispatchQueue.global().async {
print(i, terminator: " ")
}
}
for i in 101...200 {
print(i, terminator: " ")
}
print("END \(Thread.isMainThread)")
}
DispatchGroup
- 동기 함수일 경우 문제없음
- 비동기의 경우 다른 스레드에서 동작하기 때문에 순서대로 안됨
'공부하자! > iOS' 카테고리의 다른 글
메모마무 - 개인 정보 처리 방침 (3) | 2022.09.30 |
---|---|
메모마무 개발 - 중간 발표 이후 (0) | 2022.09.26 |
[TIL] Codable (0) | 2022.08.29 |
[TIL] CodeBase UI + 코드 예제 (0) | 2022.08.18 |
[TIL] 타입캐스팅 (0) | 2022.08.18 |