2017-02-09 8 views
0

私は、ユーザーの現在の場所を取得し、URL要求を実行するrequestDataという関数を使用したいと考えています。要求が完了したときにコールバックを持つためには、requestData-functionが必要です。それは成功したかどうかです。これは私がこれまでに出ているものです:別の関数からの代理応答をどのように聞くことができますか?

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} 

私の考えは、それがmyLocationを要求しますrequestDataを呼び出し、その後、performRequestを呼び出すことです。しかし、CLLocationManagerはブロックではなくデリゲートコールバックを持つrequestLocationです。私はこれをどのようにするべきですか?

self.locationManager.requestLocation({ (locations, error) in 
    if locations {} 
    else {} 
}) 

をしかし、それはありませんこれは私が理解して、ウィジェット(TodayExtension)内のコード、ある、

を明確にする..:requestLocationはこのようにしてきたかどう すべてが素晴らしいしてきたでしょうコールバックが必要です。widgetPerformUpdate(completionHandler:)が自分自身のcompletionHandlerを待ってから自分自身をトリガーする必要があるためです。

+0

CLLocationを使用してロケートの時刻と精度をチェックすることができますあなたはあなたがperformRequest()を呼び出す前に取得します。そうすれば、その場所は正確であり、できるだけ更新されていることがわかります。 – Starlord

+0

コールバックハンドラをプロパティに保存してから、デリゲートメソッドからコールバックハンドラを呼び出すことができます – Paulw11

答えて

0

CLLocationには、取得した場所の正確さと時間を確認するためのデータがいくつか含まれています。 performRequest()をリクエストする前に、このデータの精度をチェックすることができます。

CLLocationのドキュメントをチェックし、以下の疑似コードをご覧ください。 didUpdateLocationsで私はあなたのための解決策かもしれないと思うもののアイデアを得ることができます。私はSOに直接書いたので、間違いを嫌ってはいけません。

しかし、基本的には使用:

VAR horizo​​ntalAccuracy:CLLocationAccuracy {取得}

のvar verticalAccuracy:CLLocationAccuracy {取得}

VARタイムスタンプ:日付{取得}

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} 
関連する問題