본문 바로가기

IT/iOS

iOS Concurrency 프로그래밍, 동기/비동기 처리, GCD/Operation 에 대한 이해 (4)

1) 디스패치 그룹의 개념

  • 디스패치 그룹을 왜 필요한지를 이해하기 위해서는 아래의 그림과 실제 앱에서 이뤄지는 사례들을 보면 이해할 수 있다.
  • 아래 내용을 확인해보면 하나의 목적성을 가지는 작업들을 묶고 해당 작업들이 끝나는 시점에 무엇인가를 실행줘야한 경우가 있다. 예를 들어 아래와 같이 런치스크린에 진입한 이후 메인화면으로 갈 때 각 컬렉션뷰 셀에 담긴 이미지 값들이 비동기적으로 다운을 해오다보니 다운이 안되서 표현이 안되는 경우가 발생할 수 있다. 이런 경우에 디스패치 그룹을 사용해서 모든 셀들에서 이미지를 다운 받은 시점에 화면을 전환하는 작업을 수행할 수 있다.

 

  • 그리고 디스패치 그룹을 쓰는 방법은 아래와 같다.
  • 디스패치 큐를 통해서 여러 작업들을 생성하고 해당 작업들은 그룹에다 넣으면 된다. 그리고 해당 디스패치 그룹내 notify 라는 함수를 사용하여 끝나는 시점에 작업을 수행해주면 된다.

  • 그리고 그룹의 작업을 비동기적으로 처리하는 것이 아닌 동기적으로 처리하는 방법이 있는데 해당 방법은 아래와 같다.
  • 단, 아래와 같이 wait 메서드를 통해 동기적으로 처리를 할 경우 메인쓰레드에서 사용하면 안된다. → 화면이 멈추는 현상이 발생함
  • 아래에 코드 구현 방법과 동작이 어떻게 이뤄지는지 개략도가 나와있다.

 

  • 아래와 같이 wait 함수에 시간을 정해서 해당 시간이 넘도록 작업이 완수가 안되면 클로저 내부에 있는 작업을 실행하도록 셋팅을 해놓을 수도 있다.

2) 대스패치 그룹의 사용 (비동기 디스패치 그룹)

  • 디스패치 그룹을 통한 비동기 처리의 대표적인 예는 아래와 같다.
    1. 애니메이션 → 디스패치 그룹을 사용할 경우, 순차적인 애니메이션 연계를 진행하고 관리할 수 있다.
    2. URLSession → 디스패치 그룹을 사용할 경우, 여러개의 이미지를 다운 받는 등 여러 개의 비동기 함수를 실행하고 완료 시점에 한번에 작업을 처리할 수 있다.

  • 위와 내용과 같이 디스패치 워크 아이템은 작업을 객체화 하는 것을 의미한다.
  • 사용방법은 아래와 같다.

  • 그리고 cancel() 메소드를 사용하여 객체 실행을 취소할 수 있다.

  • 또한, notify 함수를 사용하여 순서를 설정할 수 있다.

  • 위 코드를 보면 item1 객체를 비동기로 시작하고 item1 작업이 끝나는 시점에 item2 객체를 실행하라는 내용을 담고 있다.

4) 심화. Dispatch Semaphore(세마포어)에 대한 이해

  • 세마포어는 한국어로 변역하면 수기 신호이다.
  • 세마포어는 작업을 하는 스레드의 수량을 제한할 때 사용한다. → 해당 코드를 사용하는 경우는 드물다.