0

私が持っているもの

問題の本質がわかりません。

私は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が押されたときに、完了ハンドラで使用されるイベントオブジェクトが割り当て解除されていると仮定します

4

1 に答える 1

1

問題がどこにあるかがわかりました。問題は、変数 event.profilePictureProgress が動的 var として宣言されていることでした (後でオブザーバーを追加するためにそれを利用するつもりでした)。

于 2015-09-05T17:16:11.527 に答える