Rückgabe von Daten aus einem asynchronen Anruf in der Swift-Funktion

Ich habe in meinem Swift-Projekt eine Utility-Klasse erstellt, die alle REST-Anforderungen und -Antworten verarbeitet. Ich habe eine einfache REST-API erstellt, damit ich meinen Code testen kann. Ich habe eine Klassenmethode erstellt, die ein NSArray zurückgeben muss, aber da der API-Aufruf asynchron ist, muss ich von der Methode innerhalb des asynchronen Aufrufs zurückgeben. Das Problem ist, dass die asynchrone Rückgabe ungültig ist. Wenn ich dies in Node tun würde, würde ich JS-Versprechen verwenden, aber ich kann keine Lösung finden, die in Swift funktioniert.

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

Antworten auf die Frage(10)

Ihre Antwort auf die Frage