티스토리 뷰
문법적으로 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를 사용할 때에는 메모리에 남아있을 수 있기 때문에 약한 참조를 해야한다고 하는데..
리팩토링을 해봐야겠다.
'에러 해결 일지 > 프로젝트 에러 해결' 카테고리의 다른 글
리팩토링의 중요성 : Hashable 커스텀 고치기.. (0) | 2023.04.12 |
---|---|
Realm 갈아치우기 (0) | 2023.03.03 |
파이어베이스 스토리지에 사진이 업로드 및 다운로드 안될 때 방법 2가지 (0) | 2023.01.13 |
Cannot assign to property: 'self' is immutable (0) | 2022.12.05 |
SwiftUI: The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions (0) | 2022.12.05 |