jwarris91
jwarris91

Reputation: 952

Filtering an API Request Response by an object array?

I am making an API call for muscles relating to an exercise, the call looks like this:

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)
            }
        }
    }
}

This returns me a whole list of all the muscles available, I need it to just return the muscles the exercise requires. This is presented in exercises as an array of muscle id's, which I feed in via the viewDidLoad below

self.loadPrimaryMuscleGroups(primaryMuscleIDs: (exercise?.muscles)!)

So I am feeding the exercises muscle array into the func as an [Int] but at this point im stumped on how to filter the request so that the resulting muscle data are only the ones needed for the exercise.

I was thinking it would be something like using primaryMuscleIDs to filter the id property of a muscle in the jsonData response, but I'm not sure how to go about that?

Hopefully, I have explained it clearly enough to come across well.

Upvotes: 1

Views: 3049

Answers (1)

Jon Brooks
Jon Brooks

Reputation: 2492

You'd want to do something like this in your else block:

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

And since the Alamofire request is asynchronous, you won't be able to return a result synchronously. Your method will need to take a callback that gets executed in the Alamofire response callback with the filtered response.

Something like (but hopefully with something more descriptive than an array of Any:

func loadPrimaryMuscleGroups(primaryMuscleIDs: [Int], callback: ([Any]) -> ()) {
    //...
    Alamofire.request(url).responseJSON { response in
        //...
        //once you get the filtered response:
        callback(filteredArray)
    }
}

Finally, check out How to parse JSON response from Alamofire API in Swift? for the proper way to handle a JSON response from Alamofire.

Upvotes: 1

Related Questions