Я пытаюсь отложить переход до тех пор, пока не получу ответ от reverseGeocodeLocation
звонка. Однако при использовании точек останова для проверки фактического изменения значения это все равно происходит после перехода пользовательского интерфейса. Я пробовал сделать функцию недействительной и с текущим возвратом String
.
РЕДАКТИРОВАНИЕ КОДА:
func getReversedGeocodeLocation(completionHandler: (String, NSError?) ->()) {
let semaphore = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
CLGeocoder().reverseGeocodeLocation(self.newMeetupLocation, completionHandler: {(placemarks, error) -> Void in
if error != nil {
print("Reverse geocoder failed with error" + error!.localizedDescription)
return
}
else if placemarks?.count > 0 {
}
else {
print("Problem with the data received from geocoder")
}
completionHandler(placemarks!.first!.name! ?? "", error)
})
dispatch_semaphore_signal(semaphore)
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}
СТАРЫЙ КОД:
let semaphore = dispatch_semaphore_create(1) //even with 0, it's not working
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in
self.newAddress = self.getReversedGeocodeLocation()
dispatch_semaphore_signal(semaphore)
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
//dispatch_semaphore_signal(semaphore)
print(self.newAddress + ".")
self.performSegueWithIdentifier("mainToNewAddress", sender: self)
func getReversedGeocodeLocation() -> String{
var address = ""
CLGeocoder().reverseGeocodeLocation(self.newAddressLocation, completionHandler: {(placemarks, error) -> Void in
if error != nil {
print("Reverse geocoder failed with error" + error!.localizedDescription)
return
}
else if placemarks?.count > 0 {
let pm = placemarks?.first!
address = pm!.name!
}
else {
print("Problem with the data received from geocoder")
}
})
return address
}
getReversedGeocodeLocation()
сам является асинхронным? - person Code Different   schedule 25.05.2016getReversedGeocodeLocation
и вызовите это закрытие из обработчика завершенияreverseGeocodeLocation
; заставить закрытие выполнить переход - person Paulw11   schedule 25.05.2016reverseGeocodeLocation
, чтобы сделать его синхронным. - person Brandon   schedule 25.05.2016CLGeocoder().reverseGeocodeLocation
и дляdispatch_semaphore_wait
, первый находится в потоке 10, а второй - в потоке 1 - person   schedule 25.05.2016