Обработчик завершения для получения координат с адреса - PullRequest
0 голосов
/ 16 апреля 2020

У меня много трудностей, чтобы обернуть голову вокруг обработчиков завершения. И я понятия не имею, как это использовать.

Вот функция с обработчиком завершения для получения геокоординат на основе строкового адреса:

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
    }

1 Ответ

0 голосов
/ 16 апреля 2020

Я предполагаю (и это только предположение), что вы использовали это выражение, не понимая, что оно означает:

if case self.currentLocation = location {
    self.queryGenerator...

Я думаю что вы, вероятно, имели в виду:

if let location = location {
    self.currentLocation = location
    self.queryGenerator...

Я думаю, вы могли подумать, что они эквивалентны, но это не так.

...