我正在从webservice(汽车数据)加载一些XML,创建一些汽车对象,并希望在TableViewController中显示它们。
当用户选择了开始和目的地位置时,我正在对网络服务进行异步调用,显示一个活动指示符,一旦数据加载,我就转到一个新视图。所以我有这样的事情:
class NewReservationViewController : UIViewController {
@IBAction func searchCarsClicked(sender: UIBarButtonItem) {
//show load cars activity indicator
loadingCarsActivityIndicator.startAnimating()
//load available cars from webservice asyncronously
DataManager.getAvailableCars([...parameter list...], carsLoadedCallback: carsLoaded)
}
func carsLoaded(loadedCars: [Car]) {
//dismiss the waiting widget
//trigger the segue and advance to the next screen
loadingCarsActivityIndicator.stopAnimating()
print("stopped cars loading activity indicator")
print("cars loaded callback called")
print("loaded \(loadedCars.count) distinct cars")
self.cars = loadedCars
performSegueWithIdentifier("showAvailableCars", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showAvailableCars" {
let carTableViewController = segue.destinationViewController as! CarTableViewController
carTableViewController.cars = self.cars
presentViewController(carTableViewController, animated: false, completion: nil)
}
}
}
class DataManager {
class func getAvailableCars([...parameter list...], carsLoadedCallback: ([Car]) -> Void){
Webservice.getAvailability([...parameter list...], completionHandler: { (data, response, error) in
//parse xml
//in the end I get an Array of Car objects
var cars: [Car] = ...
carsLoadedCallback(cars)
})}
}
}
当我使用在CarTableViewController类中创建的一些DummyData填充TableView时,它工作正常。但是,当我尝试将汽车数组传递给我的TableViewController时,我得到一个EXC_BAD_ACCESS代码= 2异常。据我所知,这是一种通常由损坏的指针引起的内存异常。所以我想我在我调用的静态方法中的静态DataManager类中创建的汽车数组被破坏了。但是我不确定,因为自动引用计数应该避免这种情况。
表视图甚至显示数据,但随后立即崩溃并出现EXC_BAD_ACCESS异常。我试图在XCode的断点选项卡中设置一个通用断点,但是我没有得到关于应用崩溃原因的合理错误消息。
您对此为何会有任何想法吗?如何获得更好的错误消息? 感谢您的帮助。
答案 0 :(得分:1)
首先检查此功能:
func carsLoaded(loadedCars: [Car])
它作为回调返回 - 它运行的是什么线程?主要还是背景? 你应该调用主线程
dispatch_async(dispatch_get_main_queue(), {
performSegueWithIdentifier("showAvailableCars", sender: self)
})
如果没有帮助 - 提供在调试器中断的位置,我可以提供帮助并查看更多内容。
UPD:没有注意到,你为什么要做手工礼物?presentViewController(carTableViewController, animated: false, completion: nil)
您的segue会自动显示视图控制器,您可以在故事板中更改它的样式(模态,推送)。
答案 1 :(得分:1)
我可以看到两个潜在的问题。第一个是你从一个可能不在主线程上的方法触发你的segue,你需要确保在主线程上完成这个。另一个问题是,在准备segue时,你要打开新的ViewController而不检查它,所以试试这个:
foreach
答案 2 :(得分:0)
正如你所说的表视图显示数据然后立即崩溃我会认为问题出在你的CarTableViewController中。你可以检查的一件事是你的单元格被渲染,如果你试图从Car对象访问一些空的信息