(Xcode 6 Beta / Swift) performSegueWithIdentifier hat eine Verzögerung vor der Übergabe

Ich lerne gerade zum ersten Mal iOS-Programmierung mit Swift und Xcode 6 Beta.

Ich erstelle eine einfache Test-App, die eine API aufrufen und dann programmgesteuert zu einer anderen Ansicht wechseln soll, um die abgerufenen Informationen anzuzeigen.

Das Problem ist der Übergang. In meiner Delegate-MethodedidReceiveAPIResultsNachdem alles erfolgreich abgerufen wurde, habe ich:

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

Wenn die App ausgeführt wird, wird die Konsole ausgegeben--> Perform segueDann dauert es ungefähr 5 bis 10 Sekunden, bis die App tatsächlich zur nächsten Ansicht wechselt. Während dieser Zeit sind alle UI-Komponenten eingefroren.

Ich bin ein wenig festgefahren, um herauszufinden, warum die Übergabe nicht sofort erfolgt oder wie man dies debuggt!

Hier ist der Vollbild-Controller:

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()

    }
}

Und mein API-Controller:

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()


    }    
}

UPDATE: Hat das basierend auf Ethans Antwort funktioniert. Nachfolgend finden Sie den genauen Code, mit dem das gewünschte Verhalten erzielt wurde. Ich musste zuweisenthat zuself Zugang zu sich selbst in derdispatch_async Block.

let that = self

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

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

Interessanterweise funktioniert dieser Code nicht, wenn ich den entferneprintln(that) Linie! (Der Build schlägt mit fehlcould not find member 'didReceiveAPIResults'). Das ist sehr merkwürdig, wenn sich jemand dazu äußern könnte ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage