🔍 서론
SwiftUI에서 비동기 통신을 할 때 Completion Handler가 주로 사용된다. 이번에는 Completion Handler가 왜 사용되어야 하는지에 대해 정리해 볼 것이다.
📱 Completion Handler
우선 아래의 예시 코드를 먼저 봐보자.
func fetchMyNetwork(completion: @escaping (MyNetwork) -> Void) {
let url = URL(string: "https://mynetwork.com")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
let decoder = JSONDecoder()
let myNetwork = try! decoder.decode(MyNetwork.self, from: data!)
completion(myNetwork)
}
task.resume()
}
fetchMyNetwork { myNetwork in
DispatchQueue.main.async {
//뷰에 데이터 장착
}
}
위의 코드는 Completion Handler가 사용된 URLSession 방식의 비동기 통신 코드 예시이다.
Completion Handler가 사용되는 이유를 본격적으로 말해보면, 우선 네트워크 요청은 곧바로 응답이 오지 않는다. URLSession.shared.dataTask()로 시작한 HTTP 요청은 서버 왕복 지연, 데이터 전송 시간 등을 거쳐야 응답을 받을 수 있다.
그런데, fetchMyNetwork() 메서드는 task.resume() 호출되면서 비동기 작업만 등록해 놓고 종료된다. 만약 여기서 Completion Handler를 사용하지 않는다면, fetchMyNetwork() 메서드가 종료됨에 따라 응답으로 온 데이터를 처리할 수 없을 것이다.
따라서, Completion Handler를 통해 fetchMyNetwork()의 생존 유무와 상관없이 네트워크 요청 응답 도착 시점에 데이터 처리를 할 수 있다.
정확히는 Completion Handler의 @escaping 키워드 덕분에 completion 클로저가 fetchMyNetwork() 메서드가 종료된 이후에도 실행될 수 있으므로 가능한 일이다.
'iOS > SwiftUI' 카테고리의 다른 글
SwiftUI View Hierarchy & Navigation Hierarchy와 Environment의 관계 (0) | 2024.10.10 |
---|---|
SwiftUI NavigationStack을 활용한 상위 뷰에서 루트 뷰 이동 (Pop to Root) (0) | 2024.08.27 |
SwiftUI @Bindable VS @State 차이점 (iOS17+ Observable Macro) (0) | 2024.08.09 |