循环通过API请求更新URL



我正在使用Googlemaps API,这将返回附近的20个位置,最多可以返回60个位置。将返回位置,并带有NextPageToken,该位置使您可以获取结果的下一页(每页20个)。我正在尝试通过API进行循环,以使自己能够获得所有可用的位置,但遇到困难:func getallNearByLocations(url:url){

我正在使用Alamofire返回API请求(我也尝试使用URLSessions)

首先,我组合一个函数,该函数在完成块中返回JSON字典

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

接下来,我们有一个使用URL初始化的getNearByLocation函数。如您所见,我们返回结果,将它们添加到数组中,检查结果最大数量(60)还是没有NextPageToken。如果其中的任何一个都是错误的,我们创建新的URL并启动我们当前再次加入的功能。当我们返回所有新位置时,循环完成。

func getAllNearbyLocations(url: URL) {
    self.getJsonFromURL(url: url) { (dictionary) in
        let newLocations: NSArray = dictionary.value(forKey: "results") as! NSArray
        self.locations.addObjects(from: newLocations as! [Any])
        if self.locations.count >= 60 {
            self.sendNewLocations(locations: self.locations)
        }
        else {
            // We want to now update the URL we are using and search again
            if let newPageToken = dictionary["next_page_token"] {
                let newURL = self.rootSearchURL + "&pagetoken=" + (newPageToken as! String)
                let url = URL(string: newURL)
                // We want to get our current URL and remove the last characters from it    
                self.getAllNearbyLocations(url: url!)
            }
            else {
                // If we have no more pages then we return what we have
                self.sendNewLocations(locations: self.locations)
            }
        }
    }
}

奇怪的是,当我用断点测试代码时,它会按预期返回。它通过功能循环,添加了所有新位置和返回。当我实时运行它时,返回的字典无法正确返回(不包含位置或下一页令牌),因此我的功能仅返回前20个位置。

我以前曾使用过API请求,但从未连续关闭。我觉得这是一个陷阱22,因为我不知道新的pagetoken,直到我致电该请求,并且一旦我返回了请求,我想立即使用该请求来调用该请求。

根据文档,

何时发出next_page_token和何时有效之间存在很短的延迟。在可用之前请求下一页将返回Invalid_request响应。使用相同的next_page_token重试请求将返回结果的下一页。

使用new_page_token

检索数据时,请尝试检查您获得的收益

尝试这样打电话:

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

相关内容

  • 没有找到相关文章

最新更新