循环更新URL的API请求

时间:2017-10-04 06:27:46

标签: swift alamofire gmsplacepicker gmsplace

我正在使用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)
    }
}

接下来我们有一个getNearByLocation函数,我们用url初始化它。如您所见,我们返回结果,将它们添加到数组中,检查我们是否有最大结果数(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,直到我调用了请求,并且一旦我返回了请求,我想立即用该令牌调用请求。

1 个答案:

答案 0 :(得分:0)

根据Documentation

  

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

尝试检查使用if

检索数据时获得的内容

尝试这样打电话:

new_page_token