2017-10-04 4 views
0

Je travaille avec l'API GoogleMaps, cela renvoie 20 emplacements à proximité et jusqu'à 60 emplacements peuvent être retournés. Les emplacements sont retournés avec un nextPageToken qui vous permet d'obtenir la page de résultats suivante (20 par page). J'essaie de parcourir l'API pour obtenir toutes les adresses disponibles mais j'ai de la difficulté: func getAllNearbyLocations (url: URL) {Boucle sur une requête API mettant à jour l'URL

J'utilise Alamofire pour retourner la requête API (j'ai également essayé d'utiliser URLSessions)

d'abord, je mis en place une fonction qui renvoie le dictionnaire JSON dans le bloc d'achèvement

// 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) 
    } 
} 

Ensuite, nous avons une fonction getNearByLocation que nous initialise avec une URL. Comme vous pouvez le voir, nous retournons les résultats, les ajoutons à un tableau, vérifions si nous avons le nombre maximum de résultats (60) ou si nous n'avons plus de nextPageToken. Si l'un d'entre eux est faux, nous créons la nouvelle URL et déclenchons la fonction dans laquelle nous sommes actuellement. La boucle se termine lorsque nous retournons tous les nouveaux emplacements. La chose étrange est quand je teste le code avec des points d'arrêt, il renvoie comme prévu. Il boucle à travers la fonction, ajoute tous les nouveaux emplacements et retours. Lorsque je l'exécute en temps réel, le dictionnaire renvoyé ne retourne pas correctement (ne contient pas les emplacements ou le jeton de page suivant) et donc ma fonction ne renvoie que les 20 premiers emplacements.

J'ai déjà utilisé des requêtes d'API mais je n'ai jamais été si proche les unes des autres. Je pense que c'est une erreur 22 car je ne peux pas connaître la nouvelle pageToken jusqu'à ce que j'ai appelé la demande et dès que j'ai renvoyé la demande, je veux appeler la demande avec ce jeton immédiatement.

Répondre

0

Selon le Documentation,

Il y a un court délai entre le moment où un next_page_token est délivré, et quand il deviendra valide. Demander la page suivante avant qu'elle ne soit disponible renverra une réponse INVALID_REQUEST. Réessayer la requête avec le même next_page_token retournera la page suivante des résultats.

Essayez de vérifier ce que vous obtenez lorsque vous récupérez des données avec new_page_token

Essayez d'appeler comme ceci:

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!) 
}