Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS Build a Weather App with Swift Managing Complexity Callback Methods With Closures

Having problem with part 2 of the call back/ closure Swift weather app challenge, can anyone help?

Been trying to figure this out for the las few days, I'm stumped. Any help will be appreciated.

Callbacks.swift
import Foundation

typealias BlogPostCompletion = ((NSData!, NSURLResponse!, NSError!) -> Void)
// Add your code below
func fetchTreehouseBlogPosts (completion: BlogPostCompletion) {

let blogURL = NSURL(string: "http://blog.teamtreehouse.com/api/")
  let requestURL = NSURL(string: "get_recent_summary/?count=20", relativeToURL: blogURL)

  let request = NSURLRequest(URL: requestURL!)

  let config = NSURLSessionConfiguration.defaultSessionConfiguration()
  let session = NSURLSession(configuration: config)

  // Add your code between the comments
let dataTask: NSURLSessionDataTask = session.dataTaskWithRequest(request)
    {(data, response, error) in 
    return (completion: data, response, error)}
  // Add code above
dataTask.resume()
}

1 Answer

Hey Justin If you didn't already solve this, then here goes :)

The completionHandler of dataTaskWithRequest should return Void, but in your closure you are trying to "return" the completion. In stead you should simply call the handler that is passed to the fetchTreehouseBlogPosts method.

let dataTask = session.dataTaskWithRequest(request) {
    (let data, let response, let error) in
    // Do stuff here
    completion(data, response, error)
}

Now the above is completely valid, but if you are not doing anything with the results, you might as well just point to the completion handler that is passed to the fetchTreehouseBlogPosts method like so:

let dataTask = session.dataTaskWithRequest(request, completionHandler: completion)
Kevin Scully
Kevin Scully
6,506 Points

In the challenge, it seems the more concise second option doesn't work.

Nope - seems you're right Kevin... It does work in the real world, though.