iOS Concurrency with GCD & Operations

Sep 12 2023 · Swift 5.8, macOS 13, iOS 16, Xcode 14.3

Part 1: Grand Central Dispatch

09. Challenge: Download a Group of Images

Episode complete

Play next episode

Next
About this episode

Leave a rating/review

See forum comments
Cinema mode Mark complete Download course materials
Previous episode: 08. Wrap an Asynchronous Function Next episode: 10. Use a DispatchSemaphore

Get immediate access to this and 4,000+ other videos and books.

Take your career further with a Kodeco Personal Plan. With unlimited access to over 40+ books and 4,000+ professional videos in a single subscription, it's simply the best investment you can make in your development career.

Learn more Already a subscriber? Sign in.

Transcript: 09. Challenge: Download a Group of Images

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!