(Xcode 6 beta / Swift) performSegueWithIdentifier tem atraso antes de segue
Estou apenas aprendendo programação Ios pela primeira vez, com Swift e Xcode 6 beta.
Estou criando um aplicativo de teste simples que deve chamar uma API e, em seguida, segue programaticamente para uma exibição diferente para apresentar as informações recuperadas.
O problema é o segue. No meu método delegadodidReceiveAPIResults
, depois que tudo foi recuperado com sucesso, eu tenho:
println("--> Perform segue")
performSegueWithIdentifier("segueWhenApiDidFinish", sender: nil)
Quando o aplicativo é executado, o console gera--> Perform segue
, mas há um atraso de 5 a 10 segundos antes que o aplicativo realmente siga para a próxima exibição. Durante esse período, todos os componentes da interface do usuário são congelados.
Estou um pouco preso tentando descobrir por que as instruções não acontecem imediatamente ou como depurar isso!
Heres O controlador Full View:
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()
}
}
E meu controlador de 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()
}
}
ATUALIZAÇÃO: Consegui trabalhar com base na resposta de Ethan. Abaixo está o código exato que acabou obtendo o comportamento desejado. Eu precisava atribuirthat
paraself
ter acesso a si mesmo dentro dodispatch_async
quadra.
let that = self
if(NSThread.isMainThread()){
self.delegate?.didReceiveAPIResults(jsonResult)
}else
{
dispatch_async(dispatch_get_main_queue()) {
println(that)
that.delegate?.didReceiveAPIResults(jsonResult)
}
}
Curiosamente, esse código não funciona se eu remover oprintln(that)
linha! (A construção falha comcould not find member 'didReceiveAPIResults'
) Isso é muito curioso, se alguém poderia comentar sobre isso ...