У меня много трудностей, чтобы обернуть голову вокруг обработчиков завершения. И я понятия не имею, как это использовать.
Вот функция с обработчиком завершения для получения геокоординат на основе строкового адреса:
func getLocation(from address: String, completion: @escaping (_ location: CLLocation?)-> Void) {
guard let address = address as? String else { return }
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(address) { (placemarks, error) in
guard let placemarks = placemarks,
let location = placemarks.first?.location else {
completion(nil)
return
}
completion(location)
}
}
И я вызываю эту функцию следующим образом :
getLocation(from: address) { location in
print("Location is", location.debugDescription)
if case self.currentLocation = location {
self.queryGenerator(searched: self.searchController.isActive, queryString: "")
} else {
self.showAlert(alertTitle: "No businsesses nearby", message: "Try going back and changing the address")
}
}
Я получаю ноль за currentLocation
. Если бы кто-нибудь смог это сделать для меня, это было бы здорово.
Я звоню по сети после получения местоположения, которое отправляет мне пользовательский объект, содержащий координаты предприятия и радиус обслуживания. Если радиус обслуживания меньше или равен расстоянию между бизнес-координатами и currentLocation, тогда я добавляю его в массив, который заполняет UITableView. Вот функция, в которой я делаю вышеупомянутые вычисления:
func applicableRestaurants(allQueriedRestaurants: [Restaurant]) -> [Restaurant] {
var filteredRestaurants = [Restaurant]()
for thisRestaurant in allQueriedRestaurants {
let restaurantCoordinate = CLLocation(latitude: thisRestaurant.geoPoint.latitude, longitude: thisRestaurant.geoPoint.longitude)
if restaurantCoordinate.distance(from: self.currentLocation!) <= thisRestaurant.distance {
filteredRestaurants.append(thisRestaurant)
}
}
return filteredRestaurants
}