通过对象数组过滤API请求响应?

时间:2017-01-10 16:47:55

标签: ios json swift api alamofire

我正在为与运动相关的肌肉进行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属性,但是我不确定如何去做?

感谢您在这里做出任何澄清,希望我已经清楚地解释清楚了解

1 个答案:

答案 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响应的正确方法。