DispatchQueue에서의 completion사용과 escaping을 쓰는 이유 + 쓰지 않는다면 어떻게 해야하는가?
04 Nov 2020 | iOS개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.
DispatchQueue 에서는 completion
DispatchQueue 코드 안에서는 흔히 return을 해주지 못한다.
이에 대한 해결방안으로 completion
을 사용해주면 된다.
예시는 아래와 같다.
func downloadJson(_ url: String, _ completion: @escaping(String?) -> Void) {
DispatchQueue.global().async {
let url = URL(string: url)!
let data = try! Data(contentsOf: url)
let json = String(data: data, encoding: .utf8)
DispatchQueue.main.async {
completion(json)
}
}
}
escaping이 없어도 에러가 나지 않으려면
func downloadJson(_ url: String, _ completion: ((String?) -> Void)?) { // code }
위와 같이 옵셔널이라면 에러가 나지 않는다. 그런데 escaping이 왜 필요한 걸까?
본 함수 downloadJson가 끝나고 실행되는 코드(: completion(json))이기에 escaping이라고 적어주는 것
본체 함수가 실행되고 나중에 실행되는 함수다. 라고 지정해주기 위해 적어주는 것!
그런데 옵셔널 함수인 경우에는 escaping이 디폴트다. 그래서 이때는 escaping을 안써줘도 되는 것!