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 QueuesSerial Queues가 존재한다.
  1. Concurrent Queues - 동시성
  • 분산 처리를 위해 여러개의 쓰레드로 보냄
  • 각자 독립적이지만, 유사한 여러개의 작업을 처리할 때 사용 (중요도 / 작업의 성격이 비슷)
  • 동시에 여러가지 큐를 가져갈 수 있음
  • 싱글 코어에서 멀티 쓰레드 방식을 동작시키는 방식
  • 작업 결과 순서가 보장되지 않음
  • 주로 API 통신할 때 사용된다.
DispatchQueue.global().async {
	// 구현부
}
  1. Serial Queues - 직렬성
  • 한 번에 하나의 큐만 가져갈 수 있음
  • 순서가 중요한 작업을 처리할 때 사용
  • 메인스레드에 순서대로 전달하되, 완료를 기다리지 않고 곧 바로 다른 작업을 진행한다.
  • 주로 UI관련 작업을 할 때 사용된다.
DispatchQueue.main.async {
	// 구현부
}



✅ Operation Queue

  • 이미 시작된 작업이 완료될 때까지 기다리지 않고 가능한 많은 작업 진행
  • Operation은 백그라운드 스레드에서 실행할 Task를 캡슐화한 객체
  • OperationQueue는 작업 실행순서를 결정할 때나 다른 요인들을 고려해서 순서를 정함
  • 비동기적으로 실행되어야 하는 작업을 객체 지향적인 방법으로 사용하는 데 적합
  • KVO(key Value Observing)를 사용해 작업 진행 상황을 감시하는 방법이 필요할 때도 적합



GCDOperation Queue
간단한 작업복잡한 작업
메서드 위주의 작업데이터와 기능을 캡슐화
상태를 알 수 없음취소/순서지정/일시중지 등 상태 추적이 쉬움
FIFO다른 요인들을 고려해 순서를 지정



참고문서
1. https://medium.com/@goehd2538/ios%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EB%B0%A9%EC%8B%9D-65aa81aad0f9

좋은 웹페이지 즐겨찾기