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()
원인
- thread block 되는게 있어서 개발자 문서 확인해보니...
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 가 아닌 곳에서 하면 됨