[iOS] CompeltionHandler를 예시를 통해 알아보자 !

eung7_·2022년 3월 16일
0

iOS

목록 보기
11/17
post-thumbnail
post-custom-banner

때는 Swift를 배운지 얼마되지 않았을 때... UIKit을 쓸 때 굉장히 자주 등장하는 CompletionHandler가 이해가 잘 되지 않았다. 물론 UIKit을 배우면서 이 메서드가 끝나갈 때 작동하는 구나~ 라고 어렴풋이 공부했던 기억이 있다. 하지만 이제는 알게 되어서 간단한 예시를 통해 나도 공부할겸 기록을 남겨보려고 한다.

CompletionHandler

CompletionHandler는 결국 클로저다. Swift 문법에 있어서 꽃이라고 불리우는 그 클로저! 만약 클로저에 대한 이해가 부족하다면 이해를 하고 오길 권장한다.

일단 제목에 쓰여진 것처럼 한 가지 예시로 CompletionHandler에 대해 알아보려고 한다. 일단 특정 URL에서 Data파일을 가져오는 메서드를 구현해보도록 하자. 그리고 그 Data 파일을 string 형식으로 변환시키는 작업을 수행하여 CompletionHandler로 string 값을 전달해주는 메서드를 구현해보자.

글만 봐서는 잘 모르니 예시 코드로 살펴보자.

func downloadJson(url : String, completionHandler : (string?) -> Void) {
	let url = URL(string : url)
    let data = try! Data(contentsOf : url)
    let json = String(data : data, encoding : .utf8)
    
    completionHandler(json)
}

우선 downloadJson메서드에 url과 completionHandler라는 클로저를 파라미터로 넣어주었다. 그리고 인자로 부터 가져온 url이 json이라는 String 타입의 상수로 변형되어 completionHandler의 인자로 넣어주었다.

여기서 CompletionHandler는 어떻게 해석할 수 있을까?

우리는 이 CompletionHandler의 로직을 나.중.에 구현해 줄 것이다.

CompletionHandler의 로직을 나중에 구현?

이것도 글로만 보면 무슨 소리인가 싶다. 예제 코드를 보면서 살펴보자.

downloadJson(myURL) { [weak self] text in
	guard let self = self else { return }
    self.editView.text = text           
}

이제 만들어두었던 downloadJson 메서드를 호출하고 미리 만들어준 myURL이라는 URL주소를 넣어주자. 그리고 주목해야 할 것은 바로 Trailing 클로저다! (Trailing Closure를 모르시다면 이해하기 힘드실 수도 있다...)

이 클로저에가 받고있는 text는 무엇일까? 바로 앞서 downloadJson에서 로직을 구현해줄 때, completionHandler의 인자로 json을 넣어준 것이다 ! 곧 trailing 클로저의 text와 downloadJson의 로직의 json이라는 상수는 똑같다는 것이다 !

우리는 completionHandler의 구현을 나중에 해준다고 했다. 그것을 trailing 클로저를 통해 로직을 구현해나가면 되는 것이다. 나는 View에 있는 editView.text에 그 값을 넣어주었다. 그럼 이제 downloadJson이라는 로직이 실행되면서 completionHandler가 수행되기 시작하면, string으로 받은 text를 받아서 내가 원하는 로직대로 수행 된다 !


여담이지만 이렇게 네트워크를 이용하는 작업에서는 Concurrent Queue로 GCD를 통해 global Queue로 보내줘야 한다. 그러면 받은 데이터를 return 값으로 보내주질 못해서 completionHandler로 받아진 데이터를 사용하는게 전통적인 방법이다. 이것을 해결하기 위해 RxSwift를 쓰면 유용하다..!

profile
안녕하세요. SW Engineer eung7입니다.
post-custom-banner

0개의 댓글