[Swift] async, await 알아보기 (@escaping closure 대응샘플)

  [Swift] async, await 알아보기


안녕하세요. 물먹고하자 입니다 :)

오늘은 async, await 를 알아보려고 합니다.

동작방식은 기존 Closure 와 동일하지만, 코드라인이 확실히 보기 좋은 장점이 있습니다.

샘플링된 코드로 비교하면서 내용 공유드립니다.


  시작전 참고 자료


  async, await 도입을 하려는 이유

보통 클로져 1번만 사용하는 경우에는 딱히? 도입해야할 이유는 없지만, 업무중에 클로져 > 클로져 > .... > 클로져 인경우에는 코드가 더러워(?) 지는 현상 발생합니다.

어차피 순차적으로 진행해야 하는데, 들여쓰기 반복적으로 나오면 개발당사자는 알고는 있지만, 몇 개월뒤에 보면 욕나오더라고요 (당사자가 봐도 더러워요... ㅠㅠ)

실제 업무때 예시)로 쓰기 딱 좋은 부분

극단적 이긴한데, 제가 맡고 있는 업무에중 로그인을 하기위해서 5번의 통신 처리를 해야합니다. 

(실제로는 저렇게 한번에 클로져를 쓰진 않지만, 정리하기 딱 좋은 예제)

주석상으로만 봐도 1. 들여쓰기 부분, 2. 실패처리 부분 의 차이가 크게 보입니다. (안 고칠 이유는 없는것 같아요)


  async, await 도입전 알아야하는 것

async, await 사용하기전 필수적으로 알아야하는 항목들이 있습니다.

1) async, await
2) Task(switch, do-catch)  (비동기 작업처리시)
3) withCheckedContinuation (클로져 상태의 async 지원)

시작의 앞서 너무 걱정안하셔도 됩니다. (사실 저는 겁먹었었음..)

1) async, await

async 함수의 결과에 붙인다.

await 함수 호출부분에 붙인다.

2-1) Task(switch)

Task 로 묶고, 사용 결과를 ResultType 사용시 Switch 문 활용부분


2-2) Task(do-catch)

Task 로 묶고, 사용 결과를 ResultType 사용시 do-catch 활용부분


3) withCheckedContinuation (클로져 상태의 async 지원)

기존의 클로져 방식을 withCheckedContinuation를 통해 지원할 수 있음.


  기존 클로져를 변경해보자

처음부터 갑자기 만들면 솔직히 활용/이해 면에서 조금 부족하다 보니 기존에 만들어놓은 비동기 콜백(클로져)구조를 async, await 구조로 변경하는 했던 샘플소스로 설명드립니다.

1) @escaping closure Sample클로져 방식을 통한 네트워크 후 결과(성공/실패) 케이스 샘플입니다. 해당샘플을 async, await 방식으로 수정하는 방법입니다. (아래)

2) async, await Sample

생각보다 전환하는게 어렵진 않으며, 다만 클로져와 async,await를 동시에 지원하진 않습니다. Func만들때 꼭 참고하세요.


  추가샘플 PHAsset -> LocalDownload async, await 활용 Sample


  마무리

언제해보나 했는데, 드디어 async, await를 경험해 보았내요. 솔직히 @escaping closure -> async, await무조건 바꿔야되는건 아닌것 같아요. 위에서 극단적 예제처럼 어쩔수 없이 중복 클로져 발생시에는 사용하는 부분에서 읽기 편하게 바꿀수 있는 장점이 있는것 같아요.

또 중간에 일부분 변경하다보니 클로져의 For 문을 순차적으로 기다려야할때 mainThread의 UI 부분이 멈추지 않아 비동기를 동기처럼 받을때 간편하게 사용할 수 있는 장점도 있네요.


오늘은 이만!

즐거운 코딩되세요. :)


끝.


댓글