2017-02-09 5 views
0

Я хочу иметь функцию, называемую 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, прежде чем запускать его.

+0

Вы можете использовать CLLocation и проверить время и точность местоположения который вы получите до того, как вы сделаете вызов функции executeRequest(). Таким образом, вы знаете, что местоположение максимально точное и обновленное. – Starlord

+0

Вы можете сохранить обработчик обратного вызова в свойстве и затем вызвать его из метода делегата – Paulw11

ответ

0

В CLLocation содержится несколько данных, чтобы проверить точность и время для местоположения. Решение для вас может состоять в проверке точности этих данных, прежде чем вы сделаете запрос на выполнениеRequest().

Ознакомьтесь с документацией для CLLocation и посмотрите на мой псевдо-код ниже. В de didUpdateLocations вы можете получить представление о том, что, на ваш взгляд, может быть решением для вас. Я написал это прямо в SO, поэтому не ненавижу ошибки.

Но в основном используют:

вар horizontalAccuracy: CLLocationAccuracy {получить}

вар verticalAccuracy: CLLocationAccuracy {получить}

вар метка времени: Дата {получить}

let location:CLLocation? //myLocation 

func requestData(){ 
    self.locationManager.requestLocation() 
    // Wait for the location to be updated 

} 
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 { 
    //When the location is accurate enough we can call 
    //the performRequest() 

    if location.horizontalAccuracy < 15 && location.timestamp > (Date().timestampSince1970 - 60){ 
     //Accurate enough?? Then do the request 
     self.performRequest(with: location, completion: completion) 

    }else{ 
     //Not accurate enough...wait to the next location update 
    } 

} 
else{//Error} 
} 
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) 
{//Error} 
Смежные вопросы