我是第一次学习使用Swift和Xcode 6 beta进行iOS编程。
我正在制作一个简单的测试应用程序,它应该调用API,然后以编程方式转换到不同的视图来呈现检索到的信息。
问题在于转换。 在我的委托方法didReceiveAPIResults
中,在成功检索到所有内容之后,我有:
println("--> Perform segue")
performSegueWithIdentifier("segueWhenApiDidFinish", sender: nil)
当应用程序运行时,控制台会输出
--> Perform segue
,但是在应用实际跳转到下一个视图之前,大约需要5-10秒的延迟时间。在此期间,所有UI组件都被冻结。我有些困惑,不知道为什么跳转不会立即发生,或者如何调试这个问题!
以下是完整的视图控制器:
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()
}
}
我的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()
}
}
更新:根据Ethan的答案进行了更改,现在已经成功运行。下面是最终实现所需行为的精确代码。我需要将that
分配给self
,以便在dispatch_async
块内访问self。
let that = self
if(NSThread.isMainThread()){
self.delegate?.didReceiveAPIResults(jsonResult)
}else
{
dispatch_async(dispatch_get_main_queue()) {
println(that)
that.delegate?.didReceiveAPIResults(jsonResult)
}
}
有趣的是,如果我删除
println(that)
这一行,代码将无法正常工作!(编译器会报错,提示“找不到成员'didReceiveAPIResults'”)。如果有人能对此进行评论,那就很有意思了...