Я пытаюсь получить ссылку на места рядом с маркером страницы.
Это мой класс:
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";
}