Разбор google поблизости api проблемы с токеном следующей страницы (swift 3, 4) - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь получить ссылку на места рядом с маркером страницы. Это мой класс:

class Place: NSObject, MKAnnotation{
var name: String
var place_id: String
var rating: Double?
var vicinity: String?
var open_now:Bool?
var coordinate: CLLocationCoordinate2D
var phone_number: String?
var timings: [String]?
var photos: [String]?
var reviews: [Review]?
var distance: Double?


init(name: String, place_id: String, locationCoordinate:CLLocationCoordinate2D) {

    self.name = name
    self.place_id = place_id
    self.coordinate = locationCoordinate
}

var subtitle: String? {
    return vicinity
}

var title: String? {
    if name.isEmpty {
        return "(No Title)"
    } else {
        return name
    }
}

} // конечное место

И ЗДЕСЬ ФУНКЦИЯ PARSE

//---------------------------------------------------------

// PARSE PLACE // ------------------------------------------------ ---------

func parse(dictionary: [String: Any]) -> [Place] {

 //   guard let status = dictionary["status"] as? String, status == "OK" else {
 //       print("Invalid status")
 //       return []
 //   }



    guard let array = dictionary["results"] as? [Any], array.count > 0 else {
        print("Expected 'results' array or Array is empty")
        return []
    }


    var searchResults: [Place] = []
    for resultDict in array
    {

        var place:Place
        if let resultDict = resultDict as? [String : Any]
        {

            if let name = resultDict["name"] as? String,
                let place_id = resultDict["place_id"] as? String,
                let geometryDict = resultDict["geometry"] as? [String : Any]
            {
                if let locationDict = geometryDict["location"] as? [String : Any] {
                    if let lat = locationDict["lat"] as? Double, let lng = locationDict["lng"] as? Double {

                        let coordinate:CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: lat, longitude: lng)

                        place = Place(name: name, place_id: place_id, locationCoordinate: coordinate)


                        if let rating = resultDict["rating"] as? Double {
                            place.rating = rating
                        }

                        if let vicinity = resultDict["vicinity"] as? String {
                            place.vicinity = vicinity
                        }

                        if let hoursDict = resultDict["opening_hours"] as? [String : Any] {
                            if let openNow = hoursDict["open_now"] as? Bool {
                                place.open_now = openNow
                                print("place.open_now \(String(describing: place.open_now))")
                            }
                        }

                        if location != nil {
                            let storeLocation: CLLocation =  CLLocation(latitude: lat, longitude: lng)
                            place.distance = calculateDistanceToStore(storeCoordinate: storeLocation)
                        }

                        searchResults.append(place)
                    }
                }
            }
        }
    }//end for

    return searchResults
}

И здесь я создаю URL, где я разбираю словарь:

func getPlacesUrl() -> String {

    let latitude = String(format: "%f", location!.coordinate.latitude)
    let longitude = String(format: "%f", location!.coordinate.longitude)
    let radius = String(format: "%.0f", Float(filterDict["selectedRadius"]!)! * 1000)
    let types = "Beachbar"
    let name = "Beachbar"


    let urlString = String("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=\(latitude),\(longitude)&radius=\(radius)&types=\(types)&name=\(name)&key=AIzaSyDG7ve7mQUbkuz9GyDrT6ArBJo98OqwwWI")

    //let url = URL(string: urlString)
    print("PLACES URL ==> \(urlString)")
    return urlString
}

Я сделал функцию, которая вызывается с кнопки

@IBAction func loadMore(_ sender: Any) {
    ShowTokenResults()
}

Моя функция попадает в созданную мной ранее ссылку на Google Api Place,

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=38.006924,23.670639&radius=90000&types=Beachbar&name=Beachbar&key=AIzaSyDG7ve7mQUbkuz9GyDrT6ArBJo98OqwwWI

, анализирует json, берет токен следующей страницы, добавляет его к первому URL, который был проанализирован ранее, и снова анализирует каждый URL с его токеном. Это моя функция:

func ShowTokenResults() {

     searchBar.resignFirstResponder()
    guard location != nil else {
        //showLocationServicesDeniedAlert()
        return
    }

    isLoading = true
    tableView.reloadData()
    hasSearched = true
    searchResults = []

    let parsedUrl = getPlacesUrl()

    Alamofire.request(parsedUrl).responseJSON { response in
        debugPrint(response)

        if let jsonDictionary = response.result.value as? [String:Any]
        {

                    for (key, value) in jsonDictionary {
                        if (key == "next_page_token") {

                            let possibleToken:String = value as! String
                            if (possibleToken != "") {
                            let myNewUrl = parsedUrl+"&pagetoken=\(possibleToken)"


                            Alamofire.request(myNewUrl).responseJSON { response in
                                debugPrint(response)

                                        if let jsonTokenDictionary = response.result.value as? [String:Any]
                                        {
                                        self.searchResults = self.parse(dictionary: jsonTokenDictionary)
                                        //print("PAGETOKEN=====\(pageToken)")
                                        //print("PARSING FROM==\(myNewUrl)")
                                        //print("TOKEN DICTIONARY==\(String(describing: jsonTokenDictionary))")

                                        DispatchQueue.main.async {
                                        self.isLoading = false
                                        self.searchResults.sort(by: { Double($0.distance!) < Double($1.distance!) })
                                        self.tableView.reloadData()
                                            }

                                    return

                                    }

                                }
                            }else{
                                print("EMPTY TOKEN")
                            }
                        }
                    }//END FOR
                }

            }

}//end sshowTokenResults

Моя проблема в том, что когда он анализирует первый URL-адрес без токена в ссылке, все в порядке. Когда он анализирует ссылку с токеном, он печатает ее, но находит пустой JSON результатов, в котором находятся ключи и значения моих данных. Это мой ответ

[Response]: <NSHTTPURLResponse: 0x281500120> { URL: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=38.006827,23.670812&radius=90000&types=Beachbar&name=Beachbar&key=AIzaSyDG7ve7mQUbkuz9GyDrT6ArBJo98OqwwWI&pagetoken=CsQEMwIAAB41b9tTGDorw8SINaE18-ap_NHTB4o4RAZNIpD3ZIta9DvrM0jg8lupXxZnr7xHD7nINYr...... } { Status Code: 200, Headers {
"Cache-Control" =     (
    "public, max-age=300"
);
"Content-Encoding" =     (
    gzip
);
"Content-Length" =     (
    86
);
"Content-Type" =     (
    "application/json; charset=UTF-8"
);
Date =     (
    "Wed, 28 Nov 2018 00:35:45 GMT"
);
Expires =     (
    "Wed, 28 Nov 2018 00:40:45 GMT"
);
Server =     (
    "scaffolding on HTTPServer2"
);
Vary =     (
    "Accept-Language"
);
"alt-svc" =     (
    "quic=\":443\"; ma=2592000; v=\"44,43,39,35\""
);
"x-frame-options" =     (
    SAMEORIGIN
);
"x-xss-protection" =     (
    "1; mode=block"
);

}}

[Result]: SUCCESS: {
"html_attributions" =     (
);
results =     (
);
status = "INVALID_REQUEST";

}

1 Ответ

0 голосов
/ 19 ноября 2018

Ваше намерение состоит в том, чтобы установить значение let url, равное URL-объекту, указанному в строке URL.Однако вы вызываете функцию finalUrl с аргументом parsedurl: String.Вот почему ваша ошибка:

Cannot convert value of type '(String) -> ()' to expected argument type 'String'

В сообщении об ошибке говорится, что вы пытаетесь установить значение String для значения функции, известного как Closure или Lambda.

Возможно, вы хотите, чтобы ваша функция finalUrl возвращала строку?

func finalUrl() -> String

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...