2017-10-04 3 views
0

Ich arbeite mit der GoogleMaps-API, dies gibt 20 in der Nähe Standorte zurück und bis zu 60 Standorte können zurückgegeben werden. Die Orte werden mit einem nextPageToken zurückgegeben, mit dem Sie die nächste Seite der Ergebnisse abrufen können (20 pro Seite). Ich versuche, die API zu durchlaufen, um mir zu ermöglichen, alle Standorte verfügbar zu bekommen, aber habe Schwierigkeiten: func getAllNearbyLocations (URL: URL) {Schleife über eine API-Anfrage Aktualisierung der URL

Ich benutze Alamofire, um die API-Anfrage zurückzugeben (ich habe auch versucht mit URLSessions)

Zuerst habe ich zusammen eine Funktion, die das json Wörterbuch im Abschluss Baustein gibt

// This function returns the JSON from a specific URL 
func getJsonFromURL(url: URL, completionHandler: @escaping (NSDictionary) ->()) { 

    Alamofire.request(url).responseJSON { response in 

     let json = response.result.value as! NSDictionary 

     completionHandler(json) 
    } 
} 

Als nächstes werden wir eine getNearByLocation Funktion haben, die wir mit einer uRL zu initialisieren. Wie Sie sehen können, geben wir die Ergebnisse zurück, fügen sie zu einem Array hinzu, prüfen, ob wir die maximale Anzahl an Ergebnissen haben (60) oder haben kein nextPageToken mehr. Wenn beide falsch sind, erstellen wir die neue URL und feuern die Funktion ab, in der wir uns gerade befinden. Die Schleife endet, wenn alle neuen Standorte zurückgegeben werden.

Die seltsame Sache ist, wenn ich den Code mit Breakpoints teste, wie erwartet zurückgegeben. Es durchläuft die Funktion, fügt alle neuen Orte hinzu und kehrt zurück. Wenn ich es in Echtzeit ausführe, wird das zurückgegebene Wörterbuch nicht korrekt zurückgegeben (es enthält nicht die Speicherorte oder das Token der nächsten Seite). Daher gibt meine Funktion nur die ersten 20 Speicherorte zurück.

Ich habe zuvor API-Anfragen verwendet, aber nie so dicht hintereinander. Ich habe das Gefühl, dass es ein Catch 22 ist, da ich das neue pageToken erst kennen kann, wenn ich die Anfrage anrufe und sobald ich die Anfrage zurückgebe, möchte ich die Anfrage mit diesem Token sofort aufrufen.

Antwort

0

Gemäß der Documentation,

Es gibt eine kurze Verzögerung zwischen dem Zeitpunkt ein next_page_token ausgegeben wird, und wann wird es gültig. Wenn Sie die nächste Seite anfordern, bevor sie verfügbar ist, wird eine INVALID_REQUEST-Antwort zurückgegeben. Wenn Sie die Anfrage mit demselben next_page_token wiederholen, wird die nächste Ergebnisseite zurückgegeben.

Versuchen zu überprüfen, was Sie bekommen, wenn Sie Daten mit new_page_token

Versuchen abrufen wie folgt zu nennen:

let newURL = self.rootSearchURL + "&pagetoken=" + (newPageToken as! String) 
let url = URL(string: newURL) 
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) { 
    // We want to get our current URL and remove the last characters from it  
    self.getAllNearbyLocations(url: url!) 
} 
Verwandte Themen