2017-09-21 8 views
-1

私はこの方法を持っている:メソッドからクロージャを使用してデータを返すにはどうすればよいですか?

internal func getCoordinate(addressString : String, 
          completionHandler: @escaping(CLLocationCoordinate2D, NSError?) -> Void) { 

     let geocoder = CLGeocoder() 
     geocoder.geocodeAddressString(addressString) { (placemarks, error) in 
      if error == nil { 
       if let placemark = placemarks?[0] { 
        let location = placemark.location! 

       completionHandler(location.coordinate, nil) 
       return 
      } 
     } 

     completionHandler(kCLLocationCoordinate2DInvalid, error as NSError?) 
    } 
} 

が好き、それを使用します。

self.getCoordinate(addressString: "Summerville, SC", completionHandler: <#T##(CLLocationCoordinate2D, NSError?) -> Void#>) 

しかし、私はこのような何かをしたい:

let currentLocation = self.getCoordinate(addressString: "Summerville, SC", completionHandler: <#T##(CLLocationCoordinate2D, NSError?) -> Void#>) 

はどのように私はそれを行うのですか?

答えて

0

通常の同期戻り値と同じように、非同期関数の値を使用することはできません。

非同期メソッドがすでに実行を完了していることを確認するには、クロージャ内の値にアクセスする必要があります。クロージャー外でその値にアクセスしようとすると、値が既に設定されていることを保証できませんでした。非同期メソッドは実際に実行を終了する前に戻りますが、クロージャーを使用してこのことを保証することができます。

この問題を解決するためのいくつかの方法(DispatchQueuesまたはPromiseKitなどの第三者フレームワークの使用など)がありますが、非同期メソッドの値を決して使用できません同期メソッドの値と同じように、何の制約もありません。

これが完了ハンドラから返されたか値にアクセスすることです:

self.getCoordinate(addressString: "Summerville, SC", completionHandler: { coordinate, error in 
    guard error == nil else {return} 
    //use the coordinate here 
}) 

あなたの現在の方法にちょうどマイナーな改善:代わりに、無効を返すの座標ジオコーディングが失敗した場合には、私はnilを返しますこの場合の座標として。

関連する問題