【问题标题】:Loop over an API request updating the URL循环更新 URL 的 API 请求
【发布时间】:2017-10-04 06:27:46
【问题描述】:

我正在使用 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,并且一旦我返回请求,我想立即使用该令牌调用请求。

【问题讨论】:

    标签: swift alamofire gmsplacepicker gmsplace


    【解决方案1】:

    根据Documentation

    从发出 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!)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2018-07-28
      • 2021-04-12
      • 1970-01-01
      • 2021-07-27
      • 2014-11-09
      • 2019-10-16
      • 2023-03-06
      • 2023-03-16
      相关资源
      最近更新 更多