Devolución de datos de una llamada asincrónica en la función Swift

He creado una clase de utilidad en mi proyecto Swift que maneja todas las solicitudes y respuestas REST. He creado una API REST simple para poder probar mi código. He creado un método de clase que necesita devolver un NSArray, pero debido a que la llamada API es asíncrona, necesito regresar del método dentro de la llamada asíncrona. El problema es que el asíncrono devuelve nulo. Si estuviera haciendo esto en Node, usaría las promesas de JS pero no puedo encontrar una solución que funcione en Swift.

import Foundation

class Bookshop {
    class func getGenres() -> NSArray {
        println("Hello inside getGenres")
        let urlPath = "http://creative.coventry.ac.uk/~bookshop/v1.1/index.php/genre/list"
        println(urlPath)
        let url: NSURL = NSURL(string: urlPath)
        let session = NSURLSession.sharedSession()
        var resultsArray:NSArray!
        let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            println("Task completed")
            if(error) {
                println(error.localizedDescription)
            }
            var err: NSError?
            var options:NSJSONReadingOptions = NSJSONReadingOptions.MutableContainers
            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: options, error: &err) as NSDictionary
            if(err != nil) {
                println("JSON Error \(err!.localizedDescription)")
            }
            //NSLog("jsonResults %@", jsonResult)
            let results: NSArray = jsonResult["genres"] as NSArray
            NSLog("jsonResults %@", results)
            resultsArray = results
            return resultsArray // error [anyObject] is not a subType of 'Void'
        })
        task.resume()
        //return "Hello World!"
        // I want to return the NSArray...
    }
}

Respuestas a la pregunta(10)

Su respuesta a la pregunta