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