본문 바로가기

iOS/Tip

Alamofire를 동기화(Synchronize)로 사용해보자


Alamofire 란?

Swift로 작성된 비동기(Asynchronize) HTTP 통신 라이브러리 입니다. iOS 개발하시는 분들이면 한번쯤은 사용하셨을꺼라 생각되고 사용하지 않은 분들도 들어본적은 있을것이라 생각됩니다. 작성 시점에서 star 개수는 3만개가 넘을 정도로 유명한 오픈소스 라이브러리입니다. Alamofire github에서 더 많은 내용을 확인할 수 있습니다.


동기 vs 비동기

동기(Synchronize)는 주어진 업무를 차례대로 처리하고 하나의 업무가 완료되기 전까지는 다음 업무로 넘어가지 않는 방식입니다. 이전 업무가 완료되기까지 대기하는 시간때문에 효율은 떨어지지만 업무의 순서가 보장이되고 업무가 병렬로 발생하지 않으므로 구성이 단순합니다.

비동기(Asynchronize)는 주어진 업무를 차례대로 처리하지만 이전 업무를 기다리지 않고 다음 업무와 병렬적으로 진행하는 방식입니다. 이전 업무가 완료되기 전까지 대기하는 시간이 없어져 효율이 증가하지만 순서가 보장되지 않아 동기대비 구성이 복잡합니다.

iOS에서는 GCD(Global Centeral Dispatch)를 시스템에서 제공하는 메인 큐를 인자값으로  이용하여 병렬처리와 스레드풀에 기반을 둔 방식의 비동기 실행 흐름을 구현하여 멀티코어 프로세서에 최적화시켜주고 그 흐름 위에서 원하는 코드가 비동기로 실행되도록 만들어줍니다.


Alamofire request를 동기화 처리??

현재 블록체인 관련 iOS Framework, App 개발을 하면서 생긴일인데 (이제 이직한지 2개월반) 하나의 함수에서 http request를 3개를 진행하고 response 값을 모아서 하나의 데이터로 만드는 작업이 있었다.. (자체 서버였으면 묶어서 한개로?? 처리했겠지만 오픈되어있는걸 사용하기때문에 어쩔수가 없는거 같았음) 

약 1년반 동안의 iOS 개발경험으론 너무나 큰 시련이였다.. (1차 좌절)
그래서 이전 버전 앱을 봤더니 그분도 나랑 같은생각을 가졌나봅니다? 동기처리를 위해 그 분은 request를 하고 usleep을 걸어놓으셨다... (2차 좌절) 

'이건 최후의 방법이다. 아름다운 방법이 아니다.'라고 생각했고 나는 DispatchGroup을 이용하여 group enter, wait, leave를 통해 1부터 1000까지 덧샘을 비동기로 처리하고 결과값을 동기로 받는 테스트했는데 잘 동작했다. (오!!) 그래서 Alamofire의 request를 1부터 1000까지 덧샘하는 부분에 추가하였는데??? Alamofire가 먹통이 되고.. 정상동작을 하지 않았다... (3차 좌절)

그런데 문득 신입때(2018년) 새로 입사하신 선임님과 Task 관리에 대해 얘기하면서 나눴던 Semaphore(세마포어)가 생각이 났다!!
DispatchGroup대신에 Semaphore를 사용했더니 동기화로 잘 작동하더라.. 굿굿

저와 같은 처리가 필요하신분은  Semaphore를 추천합니다.

샘플소스와 Semaphore에 대한건 다음에 계속?

해피코딩 :)