如何使用来自两个单独的 Alamofire 请求的数据初始化一个对象?
How can I initialize an object with data from two separate Alamofire requests?
我正在尝试向 Foursquare 的 Photos From a Venue 发出 GET 请求,并且
Foursquare 的 Explore 同时。现在(如果我错了请纠正我)我有两种方法可以通过 Alamofire 发出请求并使用 SwiftyJSON.
将响应转换为 JSON 对象
我可以使用下面的 makeRequest() 成功更新 UITableViewCell 的标签以反映数据,但无法为每个单元格的背景照片更新 UIImage。
我的问题是 A) 获取可用照片 URL,以及 B) 初始化 "pin" 同时提供来自两个单独请求的数据。为了初始化 pin,我需要设置所有的值。我从一个请求中获取了 90% 的值,从另一个请求中获取了 10%(我需要获取的照片 URL)。如何使用来自两个单独请求的数据初始化 "pin"?
makeImageRequest:
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()
}
}
和makeRequest
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 class 中有一个单独的 bindData() 方法。这有意义吗?谁能帮帮我?
更新: 一位与我合作的工程师建议我在同一个方法 makeRequest 中发出另一个请求,而不是将其分解为两个单独的方法。我还在线阅读了一个教程,该教程建议使用某种响应路由器。关于如何将这段代码重构为一种方法有什么建议吗?
更新#2:我已经重命名了这个问题,因为我意识到原来的问题不是我真正的问题
最简单的方法是串行执行这些请求。首先检索所有的图钉,然后检索所有的照片。这基本上是其他工程师的建议。
如果您同时发出这些请求,则需要额外的工作来合并响应,因为您不知道哪个请求会先return。
现在要合并引脚,您需要一种方法来唯一标识每个引脚。如果他们有一些 ID,您可以使用它。否则你必须依赖排序顺序和索引。假设每个请求 returns 相同顺序的相同引脚。
在第一个请求 return 秒后,您有一个引脚数组。然后在第二个请求回调中,您可以从此数组中检索匹配的引脚并使用新数据更新它。
我正在尝试向 Foursquare 的 Photos From a Venue 发出 GET 请求,并且 Foursquare 的 Explore 同时。现在(如果我错了请纠正我)我有两种方法可以通过 Alamofire 发出请求并使用 SwiftyJSON.
将响应转换为 JSON 对象我可以使用下面的 makeRequest() 成功更新 UITableViewCell 的标签以反映数据,但无法为每个单元格的背景照片更新 UIImage。
我的问题是 A) 获取可用照片 URL,以及 B) 初始化 "pin" 同时提供来自两个单独请求的数据。为了初始化 pin,我需要设置所有的值。我从一个请求中获取了 90% 的值,从另一个请求中获取了 10%(我需要获取的照片 URL)。如何使用来自两个单独请求的数据初始化 "pin"?
makeImageRequest:
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()
}
}
和makeRequest
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 class 中有一个单独的 bindData() 方法。这有意义吗?谁能帮帮我?
更新: 一位与我合作的工程师建议我在同一个方法 makeRequest 中发出另一个请求,而不是将其分解为两个单独的方法。我还在线阅读了一个教程,该教程建议使用某种响应路由器。关于如何将这段代码重构为一种方法有什么建议吗?
更新#2:我已经重命名了这个问题,因为我意识到原来的问题不是我真正的问题
最简单的方法是串行执行这些请求。首先检索所有的图钉,然后检索所有的照片。这基本上是其他工程师的建议。
如果您同时发出这些请求,则需要额外的工作来合并响应,因为您不知道哪个请求会先return。
现在要合并引脚,您需要一种方法来唯一标识每个引脚。如果他们有一些 ID,您可以使用它。否则你必须依赖排序顺序和索引。假设每个请求 returns 相同顺序的相同引脚。
在第一个请求 return 秒后,您有一个引脚数组。然后在第二个请求回调中,您可以从此数组中检索匹配的引脚并使用新数据更新它。