Приложение вылетает при нажатии кнопки «Назад» на контроллере навигации во время выполнения функции. - PullRequest
0 голосов
/ 21 января 2019

При медленном соединении, когда я нажимаю кнопку «Назад» на VC, оно падает при доступе к контроллеру навигации. VC уже освобожден, но setNavBarTitle выполняется после возврата к другому представлению. Я понимаю, что функция выполняется, когда VC уже освобожден, но я не уверен, как лучше всего справиться с таким сценарием?

override func viewWillAppear(_ animated: Bool){
    super.viewWillAppear(animated)

    fetchProfile(clientId: clientId) { (result, error) in
        if result?.data != nil { 
                if (result?.success)! {
                    self.clientProfile = result!.data!
                    // Avatar
                    let clientImageView = UIImageView()

                    if let url = URL(string: result!.data!.pic_url!) {
                        clientImageView.image = UIImage(named: "System/defaultAvatar")
                        let task = URLSession.shared.dataTask(with: url) { data, response, error in
                            guard let data = data, error == nil else { return }

                            // WARNING: UIImageView.image must be used from main thread only                                
                            clientImageView.image = UIImage(data: data)
                            self.setNavBarTitle(image: clientImageView.image!)
                        }
                        task.resume()
                    } 
                }
            } 
        }
    }
}

private func setNavBarTitle(image: UIImage) {
    // Crashes here -> Thread 11: Fatal error: Unexpectedly found nil while unwrapping an Optional value
    let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height
}

1 Ответ

0 голосов
/ 21 января 2019

Вы можете попробовать использовать [weak self] в обратном вызове метода, поэтому, даже если метод вызывается после освобождения VC, он не вызовет сбой, поскольку self не будет существовать:

override func viewWillAppear(_ animated: Bool){
    super.viewWillAppear(animated)

    fetchProfile(clientId: clientId) { [weak self] (result, error) in
        if result?.data != nil { 
                if (result?.success)! {
                    self?.clientProfile = result!.data!
                    // Avatar
                    let clientImageView = UIImageView()

                    if let url = URL(string: result!.data!.pic_url!) {
                        clientImageView.image = UIImage(named: "System/defaultAvatar")
                        let task = URLSession.shared.dataTask(with: url) { data, response, error in
                            guard let data = data, error == nil else { return }

                            DispatchQueue.main.async {
                                clientImageView.image = UIImage(data: data)
                                self?.setNavBarTitle(image: clientImageView.image!)
                            } 


                        }
                        task.resume()
                    } 
                }
            } 
        }
    }
}

private func setNavBarTitle(image: UIImage) {
    // Crashes here -> Thread 11: Fatal error: Unexpectedly found nil while unwrapping an Optional value
    guard let navigationBarHeight: CGFloat = self.navigationController?.navigationBar.frame.height else {
        return
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...