(Xcode 6 beta / Swift) performSegueWithIdentifier tiene retraso antes de segue

Solo estoy aprendiendo programación IOS por primera vez, con Swift y Xcode 6 beta.

Estoy haciendo una aplicación de prueba simple que debería llamar a una API, y luego pasar a otra vista mediante programación para presentar la información que se recuperó.

El problema es el segue. En mi método delegadodidReceiveAPIResults, después de que todo se ha recuperado con éxito, tengo:

println("--> Perform segue")
performSegueWithIdentifier("segueWhenApiDidFinish", sender: nil)

Cuando se ejecuta la aplicación, la consola genera--> Perform segue, pero hay un retraso de 5 a 10 segundos antes de que la aplicación realmente pase a la siguiente vista. Durante este tiempo, todos los componentes de la IU están congelados.

¡Estoy un poco atascado tratando de entender por qué la segue no ocurre de inmediato, o cómo depurar esto!

Aquí está el controlador de vista completa:

import UIKit

class ViewController: UIViewController, APIControllerProtocol {

    @lazy var api: APIController = APIController(delegate: self)

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func didReceiveAPIResults(results: NSDictionary) {

        println(results)

        println("--> Perform segue")
        performSegueWithIdentifier("segueWhenApiDidFinish", sender: nil)
    }

    @IBAction func getData(sender : AnyObject){

        println("--> Get Data from API")
        api.getInfoFromAPI()

    }
}

Y mi controlador API:

import UIKit
import Foundation

protocol APIControllerProtocol {
    func didReceiveAPIResults(results: NSDictionary)
}

class APIController: NSObject {

    var delegate: APIControllerProtocol?

    init(delegate: APIControllerProtocol?) {
        self.delegate = delegate
    }


    func getInfoFromAPI(){

        let session = NSURLSession.sharedSession()
        let url = NSURL(string: "https://itunes.apple.com/search?term=Bob+Dylan&media=music&entity=album")

        let task = session.dataTaskWithURL(url, completionHandler: {data, response, error -> Void in
            if(error) {
                println("There was a web request error.")
                return
            }

            var err: NSError?

            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.    MutableContainers, error: &err) as NSDictionary

            if(err?) {
                println("There was a JSON error.")
                return
            }

            self.delegate?.didReceiveAPIResults(jsonResult)
        })
        task.resume()


    }    
}

ACTUALIZACIÓN: Esto funcionó según la respuesta de Ethan. A continuación se muestra el código exacto que terminó obteniendo el comportamiento deseado. Necesitaba asignarthat aself tener acceso a uno mismo dentro deldispatch_async bloquear.

let that = self

if(NSThread.isMainThread()){
    self.delegate?.didReceiveAPIResults(jsonResult)

}else
{
    dispatch_async(dispatch_get_main_queue()) {
        println(that)
        that.delegate?.didReceiveAPIResults(jsonResult)
    }
}

Curiosamente, este código no funciona si elimino elprintln(that) ¡línea! (La compilación falla concould not find member 'didReceiveAPIResults') Esto es muy curioso, si alguien pudiera comentar sobre esto ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta