Reverse Geocode Block 해결 - kirseia/study GitHub Wiki

현상

CLGeocoder().reverseGeocodeLocation(location, preferredLocale: locale) { placemarks, error in
    completionHandler(placemarks, error)
}

이런 코드가 있었는데 block 되는 현상이 있었음 위 코드는 async 코드라서 sync 처럼 호출하기 위해서 아래와 같이 호출했음.

let semaphore = DispatchSemaphore(value: 0)
DispatchQueue.global().async {
 ... 
 revser geocode 호출()
 ...
 semaphore.signal()
}

semaphore.wait()

원인

When the request completes, the geocoder executes the provided completion handler on the main thread.

  • 이런 문장이 있었다.
  • 문제 코드에서 semaphore wait 를 main thread 에서 걸고, reverse geocode 코드는 return 을 main thread에서 호출 후 signal()을 하게 되어있으니 당연히 block 될 수 밖에..

해결

  • semaphore.wait() 하는 곳을 main thread 가 아닌 곳에서 하면 됨