我正在为与运动相关的肌肉进行API调用,调用如下:
func loadPrimaryMuscleGroups(primaryMuscleIDs: [Int]) {
print(primaryMuscleIDs)
let url = "https://wger.de/api/v2/muscle"
Alamofire.request(url).responseJSON { response in
let jsonData = JSON(response.result.value!)
if let resData = jsonData["results"].arrayObject {
let resData1 = resData as! [[String:AnyObject]]
if resData1.count == 0 {
print("no primary muscle groups")
self.musclesLabel.isHidden = true
} else {
print("primary muscles used for this exercise are")
print(resData)
self.getMuscleData(muscleUrl: resData1[0]["name"] as! String)
}
}
}
}
这将返回我所有可用肌肉的完整列表,我需要它才能恢复锻炼所需的肌肉。这在练习中显示为一系列肌肉ID,我通过下面的viewDidLoad输入
self.loadPrimaryMuscleGroups(primaryMuscleIDs: (exercise?.muscles)!)
所以我将运动肌肉阵列作为[Int]喂入func但是此时我很难过滤如何过滤请求,以便得到的肌肉数据只是练习所需的数据。
我认为这会像使用primaryMuscleIDs来过滤jsonData响应中肌肉的id属性,但是我不确定如何去做?
感谢您在这里做出任何澄清,希望我已经清楚地解释清楚了解
答案 0 :(得分:1)
你想在你的else块中做这样的事情:
var filteredArray = resData1.filter { item in
//I'm not exactly sure of the structure of your json object,
//but you'll need to get the id of the item as an Int
if let itemId = item["id"] as? Int {
return primaryMuscleIDs.contains(itemId)
}
return false
}
//Here with the filtered array
由于Alamofire
请求是异步的,因此您将无法同步返回结果。您的方法需要使用过滤后的响应在Alamofire
响应回调中执行回调。
类似的东西(但希望有一些比Any
数组更具描述性的东西:
func loadPrimaryMuscleGroups(primaryMuscleIDs: [Int], callback: ([Any]) -> ()) {
//...
Alamofire.request(url).responseJSON { response in
//...
//once you get the filtered response:
callback(filteredArray)
}
}
最后,请查看How to parse JSON response from Alamofire API in Swift?以了解处理来自Alamofire
的JSON响应的正确方法。