Почему MKLocalSearch для "близлежащих ресторанов" возвращается в разные города? - PullRequest
0 голосов
/ 06 сентября 2018

Я создаю простое приложение, которое позволяет пользователю сохранить свое местоположение на потом.

Цель: пользователь прикрепляет свой адрес, находясь в компании, а мы сохраняем название компании

Мой подход: Я запрашиваю местоположение из LocationManager. Затем я переворачиваю геокодирование CLLocation в CLPlacemark. Поскольку метка не распознает название компании, я запускаю MKLocalSearch для "ресторанов поблизости". Response.mapItems возвращают местоположения в совершенно разных городах.

Я указал регион и убедился, что метка правильно возвращает адрес пользователя. Итак, я считаю, что проблема лежит в MKLocalSearch.

Почему он возвращает результаты для разных городов?

Обновлено: весь код из View Controller

class ViewController: UIViewController {

    let locationManager = CLLocationManager()
    var places = [MKMapItem]()

    let naturalLanguageQuery = "closest places to eat"
    let queries = ["restaurants", "places to eat", "breakfast", "lunch", "dinner"]

    override func viewDidLoad() {
        super.viewDidLoad()
        //  Do any additional setup after loading here
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if CLLocationManager.authorizationStatus() == .notDetermined {
            locationManager.requestWhenInUseAuthorization()
        }
    }

    @IBAction func getLocation() {
        if CLLocationManager.authorizationStatus() == .authorizedWhenInUse {
            locationManager.requestLocation()
        }
    }

    func add(placemark: CLPlacemark) {
        search(placemark: placemark, index: self.queries.count - 1)
    }

    func searchCompleted(placemark: CLPlacemark) {
        guard let foo = Scraper.shared.sortByDistance(userPlacemark: placemark, items: places) else { return }
        for item in Scraper.shared.filterForUnique(items: foo) {
            print(item)
            if item.placemark.addressString == placemark.addressString {

            }
        }
    }

    func search(placemark: CLPlacemark, index: Int) {
        let request = MKLocalSearchRequest()
        guard let coordinate = placemark.location?.coordinate else { return }
        request.region = MKCoordinateRegionMakeWithDistance(coordinate, 1600, 1600)
        request.naturalLanguageQuery = queries[index]
        MKLocalSearch(request: request).start { (response, error) in
            guard error == nil else { return }
            guard let response = response else { return }
            guard response.mapItems.count > 0 else { return }

            for item in response.mapItems {
                self.places.append(item)
            }

            if index != 0 {
                self.search(placemark: placemark, index: index - 1)
            } else {
                self.searchCompleted(placemark: placemark)
            }
        }
    }
}

extension ViewController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let geocoder = CLGeocoder()
        if let loc = locations.last {
            geocoder.reverseGeocodeLocation(loc) { (placemarks, error) in
                if let error = error {
                    print("error")
                } else {
                    if let placemark = placemarks?.first {

                        print(placemark.debugDescription)
                        self.add(placemark: placemark)
                    }
                }
            }
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print(error.localizedDescription)
    }
}

1 Ответ

0 голосов
/ 08 сентября 2018

Учитывая ваш код, кажется, что ваша логика верна, но в зависимости от местоположения, вы можете не получить то, что вы хотите. Документация Apple для MKCoordinateRegion гласит, что «указание региона не гарантирует, что все результаты будут находиться внутри региона. Это всего лишь подсказка для поисковой системы». Документация по MKLocalSearch

...