(あなたがそうするようにDispatchQueue.main.async
を使用することができます)、このような呼び出しはメインスレッドで実行されなければならないことに注意してください。たとえば、このデータをテーブルビューに表示する場合は、tableView.reloadData()
(またはその兄弟メソッドの1つ)を呼び出して、実際にテーブルを更新する必要がありますデータが利用可能です。あなたはそれを呼び出すと
fileprivate func getGooglePoisForCurrentLocation(centerLatitude: Double, centerLongitude: Double, delta: Double, count: Int, closure: @escaping (Array<GMAnnotation>) -> Void) {
var annotations: [GMAnnotation] = []
placesClient.currentPlace(callback: { (placeLikelihoods, error) -> Void in
if let likelihoodList = placeLikelihoods {
for likelihood in likelihoodList.likelihoods {
let annotation = GMAnnotation()
let place = likelihood.place
annotation.location = CLLocation(latitude: place.coordinate.latitude, longitude: place.coordinate.longitude)
annotations.append(annotation)
}
closure(annotations)
}
})
}
、あなたのテーブルビューのデータソースを更新し、その後、テーブルビューをリロードします:ここにあなたの関数はクロージャである
getGooglePoisForCurrentLocationclosure(closure: { (annotations) -> Void in
tableViewDataSourceArray = annotations
tableView.reloadData()
})
注意点として、この例では、特にないですsafe - エラーチェックはなく、戻り値の型はオプションではありません.API呼び出しが失敗した場合、クラッシュする可能性があります。以下は同じ関数のより堅牢なバージョンで、エラーと適切な戻り値の型を扱います:
enum PlacesResult {
case success(Array<GMAnnotation>)
case error(Error)
}
fileprivate func getGooglePoisForCurrentLocation(centerLatitude: Double, centerLongitude: Double, delta: Double, count: Int, closure: @escaping (PlacesResult) -> Void) {
var annotations: [GMAnnotation] = []
placesClient.currentPlace(callback: { (placeLikelihoods, error) -> Void in
if let error = error {
print("Current Place error: \(error.localizedDescription)")
closure(PlacesResult.error(error))
}
if let likelihoodList = placeLikelihoods {
for likelihood in likelihoodList.likelihoods {
let annotation = GMAnnotation()
let place = likelihood.place
annotation.location = CLLocation(latitude: place.coordinate.latitude, longitude: place.coordinate.longitude)
annotations.append(annotation)
}
closure(PlacesResult.success(annotations))
} else {
closure(PlacesResult.error(Error()))
// something else went wrong but we still want this to call the closure.
}
})
}