Leave a rating/review
Challenge: Download a Group of Images
In the previous exercise, you wrapped asyncAdd to add a group argument. This enabled you to add asyncAdd_Group tasks to a dispatch group, which notified you when all the tasks finished. In this challenge, you’ll wrap URLSession dataTask, then use it to download a group of images.
Open Images.playground in the starter folder. Your challenge is to use a dispatch group to download an array of images with URLSession dataTask. When all the images finish downloading, print “All done!”, show the first image, and terminate the playground.
There’s a hint, showing you how to download one image, and steps to guide you through this challenge.
Pause this video while you complete this challenge, then resume playing the video to see my solution.
Step 1: Copy the dataTask call from the hint into dataTask_Group and replace the specific completion handler with a call to the completionHandler you’ll provide when you call dataTask_Group:
URLSession.shared.dataTask(with: url) { data, response, error in
completionHandler(data, response, error)
}.resume()
Before the dataTask call, enter the group :
group.enter()
URLSession.shared.dataTask(...
And before calling completionHandler, defer group.leave:
defer { group.leave() }
completionHandler(data, response, error) // already written
Step 2: Now call dataTask_Group, passing the url and group parameters and copying the dataTask completion handler from the hint:
dataTask_Group(with: url, group: group) { data, _, error in // don't need response
if error == nil, let data = data, let image = UIImage(data: data) {
images.append(image)
}
This specific dataTask completion handler doesn’t use response, so replace it with underscore.
Step 3: And fill in the group.notify handler:
print("All done!")
images[0]
PlaygroundPage.current.finishExecution()
Run the playground and watch the sidebar: You’ll see each job starting, the images downloading, and eventually the “All done!” message. Click the Quick-Look button to see the first image. It shouldn’t take long. If nothing appears, click stop, then run again.
Note: You’ll get a different
image[0]each time you run this.
Well done!