DispatchQueue에서의 completion사용과 escaping을 쓰는 이유 + 쓰지 않는다면 어떻게 해야하는가?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


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을 안써줘도 되는 것!