私が持っているもの
問題の本質がわかりません。
私は2つのView Controllerを持っています:
1)テーブルビューでイベントを表示するFeedViewController
2) EventViewController、イベントを押すとプッシュされます。
フィードが読み込まれると、すべてのイベントのすべての画像の非同期読み込みが開始されます。次の関数によって各イベントに対して行われます。
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
}
新しいView Controllerが押されたときに、完了ハンドラで使用されるイベントオブジェクトが割り当て解除されていると仮定します