【问题标题】:How can I initialize an object with data from two separate Alamofire requests?如何使用来自两个单独的 Alamofire 请求的数据初始化对象?
【发布时间】:2015-03-18 04:38:30
【问题描述】:

我正在尝试向 Foursquare 的 Photos From a Venue 和 同时也是 Foursquare 的Explore。现在(如果我错了,请纠正我)我有两种方法可以通过 Alamofire 发出请求并使用 SwiftyJSON 将响应转换为 JSON 对象。

我可以使用下面的 makeRequest() 成功更新 UITableViewCell 的标签以反映数据,但无法为每个单元格的背景照片更新 UIImage。

我的问题是 A) 获取可用的照片 URL,以及 B) 初始化“pin”,同时提供来自两个单独请求的数据。为了初始化 pin,我需要设置所有的值。我从一个请求中获取了 90% 的值,从另一个请求中获取了 10%(我需要获取的照片 URL)。如何使用来自两个单独请求的数据初始化“pin”?

ma​​keImageRequest

    func makeImageRequest() {

    let venueID = "43695300f964a5208c291fe3"
    let firstURL = "https://api.foursquare.com/v2/venues/\(venueID)/photos"

    Alamofire.request(.GET, firstURL, parameters: [
        "client_id" : foursquareClientID,
        "client_secret" : foursquareClientSecret,
        "v" : "20140806",
        "m" : "foursquare",
        "limit" : "10"
        ])
        .responseJSON { (request, response, data, error) in
            println(request)
            println(response)
            println(error)

            let jsonObj = JSON(data!)
            self.pins = []
            for obj in jsonObj["response"]["photos"]["items"].arrayValue {
                let photoURL = obj["prefix"]["suffix"].stringValue
                println("the photo url is\(photoURL)")
                let pin = Pin(title: obj["venue"]["name"].stringValue, openUntil: obj["venue"]["hours"]["status"].stringValue, address: obj["venue"]["location"]["address"].stringValue, ratingSignals: obj["venue"]["ratingSignals"].stringValue, ratingImage: UIImage(named:"Score8-5")!, venueImage: UIImage(named: "FloraGrubTestImage.jpg")!)
                self.pins.append(pin)
            }
            self.tableView.reloadData()

    }
}

ma​​keRequest

    func makeRequest(searchString: String) {

    let secondURL = "https://api.foursquare.com/v2/venues/explore"

    Alamofire.request(.GET, secondURL, parameters: [
        "client_id" : foursquareClientID,
        "client_secret" : foursquareClientSecret,
        "ll" : "37.71987,-122.470089",
        "query" : searchString,
        "radius" : "1000",
        "limit" : "10",
        "v" : "20140806",
        "m" : "foursquare"
        ])
        .responseJSON { (request, response, data, error) in
            println(request)
            println(response)
            println(error)

            let jsonObj = JSON(data!)
            self.pins = []
            println(jsonObj)
            for obj in jsonObj["response"]["groups"][0]["items"].arrayValue {
                let pin = Pin(title: obj["venue"]["name"].stringValue, openUntil: obj["venue"]["hours"]["status"].stringValue, address: obj["venue"]["location"]["address"].stringValue, ratingSignals: obj["venue"]["ratingSignals"].stringValue, ratingImage: UIImage(named:"Score8-5")!, venueImage: UIImage(named: "FloraGrubTestImage.jpg")!)
                self.pins.append(pin)
            }
            self.tableView.reloadData()
    }
}

我的 UITableViewCell 类中有一个单独的 bindData() 方法。这有意义吗?谁能帮帮我?

更新:与我一起工作的一位工程师建议我在同一个方法 makeRequest 中发出另一个请求,而不必费心将其分解为两个单独的方法。我还阅读了一个在线教程,该教程建议使用某种响应路由器。关于如何将此代码重构为一种方法的任何建议?

更新 #2:我已经重命名了这个问题,因为我意识到原来的问题不是我真正的问题

【问题讨论】:

  • 您在显示图像时到底有什么问题?除了两个静态图像Score8-5FloraGrubTestImage.jpg 之外,我看不到您设置图像的位置。
  • @Rengers Score8-5 和 FloraGrubTestImage.jpg 只是我在 xcassets 和支持文件中的占位符图像。我正在尝试解析来自foursquare“来自地点的照片”端点的JSON响应,并将其转换为可用的图像URL。然后我将获取图像 URL 并使用 Haneke。
  • 那么您的实际问题是什么?因为我能看到的与照片相关的唯一代码是 photoURL 变量,您实际上并没有在任何地方使用它。
  • 我的问题是 A) 获取可用的照片 URL,以及 B) 初始化“pin”,同时提供来自两个单独请求的数据。为了初始化 pin,我需要设置所有的值。我从一个请求中获取了 90% 的值,从另一个请求中获取了 10%(我需要获取的照片 URL)。如何使用来自两个单独请求的数据初始化“pin”?
  • @Rengers 我相应地重命名了问题

标签: ios swift foursquare alamofire swifty-json


【解决方案1】:

最简单的方法是串行执行这些请求。首先取回所有图钉,然后取回所有照片。这基本上是其他工程师的建议。

如果您并行触发这些请求,则需要额外的工作来合并响应,因为您不知道哪个请求会先返回。

现在要合并引脚,您需要一种唯一标识每个引脚的方法。如果他们有一些 ID,您可以使用它。否则,您必须依赖排序顺序和索引。假设每个请求以相同的顺序返回相同的引脚。

第一个请求返回后,您有一个引脚数组。然后在第二个请求回调中,您可以从该数组中检索匹配的 pin 并使用新数据对其进行更新。

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 2013-06-16
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2015-09-17
    • 2017-03-21
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多