そもそも非同期処理なので、無理やり同期処理のように戻り値を返すのはあまりオススメしません、むしろ getLocation
をクロージャーで処理するのはいかがでしょうか?
swift
1func getLocation(latitude: CLLocationDegrees,longitude: CLLocationDegrees, completion: ((String?) -> Void)?) {
2 let location = CLLocation(latitude: latitude, longitude: longitude)
3 CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in
4
5 let place = placemarks?.first
6 completion?(place?.postalCode)
7 })
8}
使うときは
swift
1getLocation(latitude: latitude, longitude: longitude) { postalCode in
2 if let postalCode = postalCode {
3 //やりたい処理
4 }
5}
どうしても戻り値で返したい場合は semaphore
を使えばできないことはないが…場合によってはデッドロックがかかることになりますので
swift
1func getLocation(latitude: CLLocationDegrees, longitude: CLLocationDegrees) -> String? {
2
3 let location = CLLocation(latitude: latitude, longitude: longitude)
4 var postalCode: String?
5
6 let semaphore = DispatchSemaphore(value: 0)
7 CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in
8 let place = placemarks?.first
9 postalCode = place?.postalCode
10 semaphore.signal()
11 })
12 semaphore.wait(timeout: .now() + .seconds(60)) // 60秒経っても結果がなかったら nil を返す
13
14 return postalCode
15
16}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/09 11:02