ios

[ios - Swift] URLSession DataTask 동기처리

POKY_0908 2020. 11. 14. 18:00

 

 

 

 

URLSessio Http Requst 처리를 기다렸다가 다음 작업을 해야 할 때가 있는데 비동기 처리방식으로 인해 불편했던 적이 있는데

 

아래와 같은 방법으로 해결하도록 하겠습니다.

 

 

 

 

 

URLSession을 사용해 Http 접속을 하는 방법을 모르시는 분은 아래 주소를 참조해 주세요.

 

2020/11/12 - [스위프트] - Swift URLSession으로 Json 데이터 가져오기

 

Swift URLSession으로 Json 데이터 가져오기

1. 준비 단계 Json을 받아올 Rest API URL이 필요하기 때문에 환율정보를 받을 수 있는 API 주소를 가져왔다. 아래 사이트에서 환율 정보를 가져올 수 있는 주소를 복사 후 변수에 넣는다. happycgi.com/1649

poky-develop.tistory.com

 

 

 

지난 시간에 작성한 코드의 실행해보면 completionHandler가 실행되기 전에 변수 httpContent의 값을 리턴하기 때문에 nil이 나오게 됩니다.

 

이것을 두 가지 방법으로 동기 처리하도록 하겠습니다.

 

1. While loop

 

 

 

resume을 실행 후 While loop에서 completionHandler가 호출될 때까지 대기하고 있습니다.

 

completionHandler가 호출되고 모든 작업이 완료된다면 bool 변숫값을 false로 변경해 loop를 빠져나올 수 있도록 합니다.

 

 

 

2. 세마포어

 

세마포어란 여러 프로세스에서 자원에 접근을 막는 것이라고 정의되어있습니다.

 

세마포어의 value 값이 0 이하인 경우 실행되지 않으며 0 이상일 경우 value 값이 감소되면서 대기합니다.

 

 

let semaphore = DispatchSemaphore(value: 0)

 

value의 값이 0 일 경우 signal() 이 호출될때까지 대기합니다.

semaphore.wait() 

 

semaphore.signal()

 

 

이제 기존 while loop를 사용한 함수를 아래와 같이 수정하면 비동기를 동기 처리해서 사용 가능합니다.