Я хочу иметь функцию, называемую requestData, которая получит текущее местоположение пользователя, а затем выполнит URL-запрос. Мне нужна функция requestData, чтобы иметь обратный вызов для того, когда запрос завершен, или нет, это не удалось. Это то, что я придумал до сих пор:Как прослушивать ответ делегата от другой функции?
requestData(_ completion:@escaping()->()){
self.locationManager.requestLocation()
// Wait for the location to be updated
let location:CLLocation? = //myLocation
self.performRequest(with: location, completion: completion)
}
func performRequest(with location:CLLocation?, completion:@escaping()->()){
//Does the URL-request, and simply calls completion() when finished.
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.first {//Success}
else{//Error}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
{//Error}
Мои мысли позвонить requestData, он будет запрашивать MyLocation, а затем вызвать performRequest. Но CLLocationManager делает requestLocation
с делегатами-обратными вызовами, а не с блоком. Как мне это сделать? Все уже было бы здорово, если бы requestLocation был так:
self.locationManager.requestLocation({ (locations, error) in
if locations {}
else {}
})
Но это не ..
Чтобы уточнить, это код в виджет (TodayExtension), который, как я понимаю , нужен обратный вызов, так как мне нужен widgetPerformUpdate(completionHandler:)
, чтобы дождаться моего собственного завершенияHandler, прежде чем запускать его.
Вы можете использовать CLLocation и проверить время и точность местоположения который вы получите до того, как вы сделаете вызов функции executeRequest(). Таким образом, вы знаете, что местоположение максимально точное и обновленное. – Starlord
Вы можете сохранить обработчик обратного вызова в свойстве и затем вызвать его из метода делегата – Paulw11