如果在 PushViewController 之后完成,后端完成处理程序会使应用程序崩溃
Backend Completion Handler crashes app if completed after PushViewController
我有什么
我不明白问题的本质。
我有 2 个视图控制器:
1) FeedViewController ,在表格视图中显示事件
2) EventViewController,按下事件时推送。
当 Feed Loads 时,它开始异步加载所有事件的所有图像。
通过以下函数为每个事件完成:
EventsManager().loadProfilePictureById(event.profilePictureID as String, currentProgress: event.profilePictureProgress, completionHandler: {
(progress:Double, image:UIImage!, error:NSError!) -> Void in
event.profilePictureProgress = progress
if image != nil {
event.profilePicture = image
}
if (error == nil){
if (self.tableView.headerViewForSection(index) != nil){
var header:eventHeaderView = self.tableView.headerViewForSection(index) as! eventHeaderView
header.updateProfilePicture(
self.eventsManager.events[index].profilePictureID as String,
progress: self.eventsManager.events[index].profilePictureProgress,
image: self.eventsManager.events[index].profilePicture)
}
}else{
println("Error:" + error.description)
}
})
下面是我如何推送 EventViewController:
func PushEventViewController(sender:UITapGestureRecognizer)->Void{
let ViewSender = sender.view!
let selectedRow = ViewSender.tag
//let Cell:HomeEventTableViewCell = TimelineEventTable.cellForRowAtIndexPath(SelectedIndexPath) as HomeEventTableViewCell
dispatch_async(dispatch_get_main_queue(), {
() -> Void in
let VC:EventViewController = self.storyboard?.instantiateViewControllerWithIdentifier("EventViewController") as! EventViewController
VC.event = self.eventsManager.events[selectedRow]
self.navigationController?.pushViewController(VC, animated: true)
})
}
问题
问题是,如果我在下载图像之前按下事件并按下 EventViewController(仍然会调用完成处理程序),它会使应用程序崩溃。
假设
我为此苦苦挣扎了好几天,找不到解决办法,
但我的假设是完成处理程序在
之后调用
在推送 EventViewController 后尝试执行以下行时发生崩溃:
event.profilePictureProgress = progress
if image != nil {
event.profilePicture = image
}
我假设在推送新视图控制器时,正在释放完成处理程序中使用的事件对象
找出问题所在,问题是变量 event.profilePictureProgress 被声明为动态变量(我打算利用它在之后添加观察者)。
我有什么
我不明白问题的本质。
我有 2 个视图控制器:
1) FeedViewController ,在表格视图中显示事件
2) EventViewController,按下事件时推送。
当 Feed Loads 时,它开始异步加载所有事件的所有图像。 通过以下函数为每个事件完成:
EventsManager().loadProfilePictureById(event.profilePictureID as String, currentProgress: event.profilePictureProgress, completionHandler: {
(progress:Double, image:UIImage!, error:NSError!) -> Void in
event.profilePictureProgress = progress
if image != nil {
event.profilePicture = image
}
if (error == nil){
if (self.tableView.headerViewForSection(index) != nil){
var header:eventHeaderView = self.tableView.headerViewForSection(index) as! eventHeaderView
header.updateProfilePicture(
self.eventsManager.events[index].profilePictureID as String,
progress: self.eventsManager.events[index].profilePictureProgress,
image: self.eventsManager.events[index].profilePicture)
}
}else{
println("Error:" + error.description)
}
})
下面是我如何推送 EventViewController:
func PushEventViewController(sender:UITapGestureRecognizer)->Void{
let ViewSender = sender.view!
let selectedRow = ViewSender.tag
//let Cell:HomeEventTableViewCell = TimelineEventTable.cellForRowAtIndexPath(SelectedIndexPath) as HomeEventTableViewCell
dispatch_async(dispatch_get_main_queue(), {
() -> Void in
let VC:EventViewController = self.storyboard?.instantiateViewControllerWithIdentifier("EventViewController") as! EventViewController
VC.event = self.eventsManager.events[selectedRow]
self.navigationController?.pushViewController(VC, animated: true)
})
}
问题
问题是,如果我在下载图像之前按下事件并按下 EventViewController(仍然会调用完成处理程序),它会使应用程序崩溃。
假设
我为此苦苦挣扎了好几天,找不到解决办法, 但我的假设是完成处理程序在
之后调用在推送 EventViewController 后尝试执行以下行时发生崩溃:
event.profilePictureProgress = progress
if image != nil {
event.profilePicture = image
}
我假设在推送新视图控制器时,正在释放完成处理程序中使用的事件对象
找出问题所在,问题是变量 event.profilePictureProgress 被声明为动态变量(我打算利用它在之后添加观察者)。