gpt4 book ai didi

ios - Swift 信号量在调用 UI 之前不等待函数完成

转载 作者:行者123 更新时间:2023-11-28 12:48:02 26 4
gpt4 key购买 nike

我正在尝试延迟 segue,直到我收到来自 reverseGeocodeLocation 调用的响应。但是,当使用断点来检查值何时实际更改时,它仍然会在 UI 转换发生后发生。我试过让函数为 void 并返回当前的 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
}

最佳答案

使用信号量并将调用分派(dispatch)到 getReversedGeocodeLocation 不必要地复杂。 CLGeocoder().reverseGeocodeLocation 已经是异步的。如果您只是将完成处理程序闭包传递给 getReversedGeocodeLocation,那么您可以使用它来调用 segue;

self.getReversedGeocodeLocation(self.newAddressLocation, completionHandler: { (address,error) in 
guard error == nil else {
print("Reverse geocoder failed with error" + error!.localizedDescription)
return
}

guard let address = address else {
print("No address returned")
return
}

self.newAddress = address
dispatch_async(dispatch_get_main_queue(), {
self.performSegueWithIdentifier("mainToNewAddress", sender: self)
})
})

func getReversedGeocodeLocation(addressLocation: String, completionHandler:((address: String?, error: NSError?) -> Void))) {
CLGeocoder().reverseGeocodeLocation(self.newAddressLocation, completionHandler: {(placemarks, error) -> Void in

var address = nil

if placeMarks.count > 0 {
if let pm = placeMarks!.first {
address = pm.name
}
} else {
print("Problem with the data received from geocoder")
}

completionHandler(address,error)
})
}

关于ios - Swift 信号量在调用 UI 之前不等待函数完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com