본문 바로가기
iOS랑 친해지기

[iOS] CompletionHandler (비동기처리)

by 데브킹덕 2023. 8. 31.

 

직역

The completion handler to execute after the activity view controller is dismissed.

액태비티 뷰 컨트롤러가 해제된 후 실행할 완료 핸들러

 

- 비동기(작업이 순차적으로 실행되지 않고 별도의 스레드나 큐에서 실행되는) 작업이 완료되었을때 실행되는 클로저

- 대표적으로 네트워크 요청의 응답 처리, 파일 다운로드 및 데이터 처리 등이 있다.

 

 

- 이 프로퍼티는 UIActivityViewControllerCompletionHandler 타입의 클로저를 저장한다.

- 클로저는 nullable로 설정되어 있어 값을 가질 수도있고, nil일 수도 있다.

- nonatomic: 멀티 스레드 환경에서 해당 프로퍼티에 동시에 접근하지 않는다.

- copy: 클로저가 복사되어 저장됨. 클로저는 참조 타입으로 해당 클로저를 복사하여 나중에 참조된 객체와 분리되어 독립적으로 사용가능

 

사용방식

func performAsyncTask(completion: (ResultType) -> Void) {
    // 비동기 작업 수행
    // 작업이 완료되면 completion 클로저 호출
    completion(result)
}

- ResultType에는 비동기 작업의 결과를 나타내는 형식

- result는 작업이 완료되었을때 호출될 함수나 코드

 

 

 

예제) 

- Alamofire 라이브러리와 Papago API를 활용하여 HTTP 통신을 수행하고 데이터를 가공하려 했다

- 쿼리스트링에 담을 param과 텍스트를 변경하고자 하는 label을 인자로 받아 해석된 데이터를 받아오려고 했다.

 

참고) Alamofire는 main큐가 아닌 백그라운드 큐에서 비동기적으로 작동하여 Label(UI변경) 작업을 main큐에서 비동기적으로 작업하였다.

 

여기서 Alamofire request 메서드와 DispatchQueue main async블록에서  CompletionHandler을 사용하였다.

AF.request(){ response in
  //completion 
}

 

HTTP통신이 완료하게 되면 completionHandler에 의해 클로저 부분이 실행하게 된다.

이제 response.result 결과 값으로 JSON 데이터를 가공하면 된다.

 

인자로 Label의 값을 받아 text를 변경하는 것이 아닌 downloadJson 메서드를 호출해 UI를 변경하도록 하였다. 

변경 전
변경 후