티스토리 뷰

문법적으로 Escaping Closure에 대해 봤을 때는 많이 와닿지 않았는데

네트워크 통신할 때 꼭 필수템이었던 것...

 

전에 프로젝트를 할 때에는 아무 생각없이 Escaping Closure를 사용했었는데

부트캠프 이후 한층 더 성장한 개발자가 되었나...

 

하튼 네이버의 언어감지 API와 파파고 API를 사용하여 번역 앱을 만들고 있었는데

print를 찍어봤을 때에는 올바르게 통신하여 잘 주고 받았다.

그런데 UI상에서는 자꾸 빈 문자열이 보여...

 

체크 포인트를 찍어서 확인해보니 UI를 그리는 함수가 API 통신 하는 함수보다 빨리 실행되고,

그 이후에 API 통신 하는 함수 내부 로직들을 실행하네..

 

NetworkManager 파일에서 서버 response값을 받아오는 작업이 끝났을 때 호출하려면...

Escaping Closure를 써야한다.

 

아래 코드에서 escapingHandler의 역할은

 서버에서 결과값이 내려와 함수가 끝났을때 진행할 업무를 담당하고,

 탈출 클로저를 적용할 것이다.

 

static func getDetectLangs(
        _ text: String,
        escapingHandler : @escaping (String) -> ()) {
        let url = "https://openapi.naver.com/v1/papago/detectLangs"
        let parameter: Parameters = ["query": text]
        AF.request(url,
                   method: .post,
                   parameters: parameter,
                   encoding: URLEncoding(destination: .queryString),
                   headers: ["Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                             "X-Naver-Client-Id": "---------------",
                             "X-Naver-Client-Secret": "-------------"])
            .validate(statusCode: 200..<500)
            .responseData { (response) in
            /** 서버로부터 받은 데이터 활용 */
            switch response.result {
            case .success(let data):
                /** 정상적으로 reponse를 받은 경우 */
                print("data \(data)")
                do {
                    let decodingData = try JSONDecoder().decode(DetectLangs.self, from: data)
                    escapingHandler(decodingData.langCode)
                } catch {
                  print(error.localizedDescription)
                }
               
            case .failure(let error):
                /** 그렇지 않은 경우 */
                print(error.localizedDescription)
            }
        }
    }

 

위처럼 @escaping 키워드가 있으면 함수가 리턴되고 실행되는 것을 의미한다.

Escaping Closure을 사용하면 아래처럼 매개변수로 던진 text를 NetworkingManager에서 매개변수로 받아

서버에서 결과 값을 반환하거나 함수가 끝나면 escapingHandler로 decodingData.langCode를 반환할 수 있다.

그래서 String타입으로 반환되기 때문에 저 부분에 원하는 상수명을 사용하여 필요한 곳에 쓰면 된다.

 

 

이렇게 하니 원하는 대로 데이터를 처리할 수 있었다.

또 escaping closure를 사용하면 함수의 실행 순서를 보장받을 수 있어서 네트워크 통신할 때 원하는 결과로 처리하기가 용이하다.

 

주의할 점은 escaping closure를 사용하지 않았을 시에는

함수 외부에서 실행되거나 데이터를 저장해놓지 않아서 메모리에 올라가 있지 않지만

escaping closure를 사용할 때에는 메모리에 남아있을 수 있기 때문에 약한 참조를 해야한다고 하는데..

리팩토링을 해봐야겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함