Swift의 동기와 비동기 그리고 GCD
Synchronous (동기)
- 응답이 완료될 때까지, 다음 동작을 수행할 수 없음
- 기본적으로 프로그래밍은 동기로 이루어 짐
- 요청과 결과가 한 자리에서 동시에 일어남
- 노드 사이의 작업 처리 단위를 동시에 맞춤
- 요청을 하면, 시간과 상관 없이 그 자리에서 결과가 주어져야 함
- A 작업이 완료될 때까지, B 작업 수행 불가
func distance(p1 : Int, p2 : Int) -> Int {
return abs(p2 - p2)
}
func area(x1 : Int, y1 : Int, x2 : Int, y2 : Int) -> Int {
let dX = distance(x1, x2) // 이 줄에서 실행하고, distance 를 돌아 오는동안 area은 멈춰있는다.
let dY = distance(y1, y2)
return dX * dY
}
Asynchronous (비동기)
- 응답 상태와 상관 없이, 다음 동작 수행 가능
- 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 됨
- 요청을 하면, 그 자리에서 결과가 주어지지 않음
- 작업 결과 순서가 보장되지 않음
- A 작업과 함께 B작업 수행 가능 ( A 작업은 결과 값이 나오는대로 출력 )
동기와 비동기를 쉽게말해,
카페에서 음료를 주문한다고 해보자.
앞사람이 주문을 하고, 음료를 받을 때 까지 내가 주문을 못하는 게 동기
한 직원이 주문을 받고 손님들에게 진동벨을 나눠주고, 다른 직원은 계속 음료를 만들어 제공하는 게 비동기
Swift에서 비동기를 실행하는 방법?
✅ GCD (Grand Central Dispatch)
- GCD는 DispatchQueue라는 큐를 관리한다.
- DispatchQueue에는
Concurrent Queues
와Serial Queues
가 존재한다.
- Concurrent Queues - 동시성
- 분산 처리를 위해 여러개의 쓰레드로 보냄
- 각자 독립적이지만, 유사한 여러개의 작업을 처리할 때 사용 (중요도 / 작업의 성격이 비슷)
- 동시에 여러가지 큐를 가져갈 수 있음
- 싱글 코어에서 멀티 쓰레드 방식을 동작시키는 방식
- 작업 결과 순서가 보장되지 않음
- 주로 API 통신할 때 사용된다.
DispatchQueue.global().async {
// 구현부
}
- Serial Queues - 직렬성
- 한 번에 하나의 큐만 가져갈 수 있음
- 순서가 중요한 작업을 처리할 때 사용
- 메인스레드에 순서대로 전달하되, 완료를 기다리지 않고 곧 바로 다른 작업을 진행한다.
- 주로 UI관련 작업을 할 때 사용된다.
DispatchQueue.main.async {
// 구현부
}
✅ Operation Queue
- 이미 시작된 작업이 완료될 때까지 기다리지 않고 가능한 많은 작업 진행
- Operation은 백그라운드 스레드에서 실행할 Task를 캡슐화한 객체
- OperationQueue는 작업 실행순서를 결정할 때나 다른 요인들을 고려해서 순서를 정함
- 비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용하는 데 적합
- KVO(key Value Observing)를 사용해 작업 진행 상황을 감시하는 방법이 필요할 때도 적합
GCD | Operation Queue |
---|---|
간단한 작업 | 복잡한 작업 |
메서드 위주의 작업 | 데이터와 기능을 캡슐화 |
상태를 알 수 없음 | 취소/순서지정/일시중지 등 상태 추적이 쉬움 |
FIFO | 다른 요인들을 고려해 순서를 지정 |
Author And Source
이 문제에 관하여(Swift의 동기와 비동기 그리고 GCD), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jee/Swift의-동기와-비동기-그리고-GCD저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)