Swift 4 Получите несколько мест из Google Places API - PullRequest
1 голос
/ 08 апреля 2019

У меня проблемы с получением нескольких мест из Google Places API.Проблема в том ... если я получу только один тип булавки, такой как Bar s, все в порядке, нет проблем.Но если я пытаюсь получить Restaurants, Bars, Casino ... нескольких типов, это дает мое единственное первое место, в нашем случае Restaurants.

Я попытался сделать тот же запрос с Почтальон со ссылкой ниже ... но например

  • рестораны 1030 строк JSON
  • политические 83 строки
  • попытки получить рестораны + политические = 965строки JSON.

Я использую этот код, чтобы получить места, которые я хочу:

func fetchPlacesNearCoordinate(_ coordinate: CLLocationCoordinate2D, radius: Double, types:[String], completion: @escaping PlacesCompletion) -> Void {

    var urlString = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=\(coordinate.latitude),\(coordinate.longitude)&radius=\(50000)&rankby=prominence&sensor=true&key=\(googleApiKey)"
    let typesString = types.count > 0 ? types.joined(separator: "|") : "food"
    urlString += "&types=\(typesString)"
    urlString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) ?? urlString

    guard let url = URL(string: urlString) else { completion([]); return }

    if let task = placesTask, task.taskIdentifier > 0 && task.state == .running {
        task.cancel()
    }

    DispatchQueue.main.async {
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    }

    placesTask = session.dataTask(with: url) { data, response, error in

        if data != nil{
            for el in data!{
                //print(el)
            }
        }
        var placesArray: [PlaceContent] = []
        defer {
            DispatchQueue.main.async {
                UIApplication.shared.isNetworkActivityIndicatorVisible = false
                completion(placesArray)
            }
        }

        guard let data = data else { return }

        do{
            let decode = try JSONDecoder().decode(GooglePlacesAnswer.self, from: data)
            placesArray = (decode.results?.map{ $0.toPlaceContent() }) ?? []
        } catch let value{
            print(value.localizedDescription)
        }
    }
    placesTask?.resume()
}

1 Ответ

1 голос
/ 08 апреля 2019

Вы не можете получить места для нескольких типов, как указано в официальной документации. Вы должны сделать несколько запросов и объединить результаты.

https://developers.google.com/maps/documentation/javascript/places

тип - Ограничивает результаты местами, соответствующими указанному типу. Можно указать только один тип (если указано несколько типов, все типы, следующие за первой записью, игнорируются). Смотрите список поддерживаемые типы .

...