Сообщение о сбое iOS: [состояние NSURLSessionDataTask]: нераспознанный селектор отправлен в экземпляр

У меня есть экран с панелью поиска, когда я покидаю этот экран, я просто отменяю текущую работу urlSessionDataTask. Вот мой код, которым я пользуюсь:

override func viewWillDisappear(_ animated: Bool) {

    if self.lastURLSessionDataTask != nil, self.lastURLSessionDataTask!.state == .running{
       self.lastURLSessionDataTask!.cancel();
       self.lastURLSessionDataTask = nil;
    }

    super.viewWillDisappear(animated);
}

Как вы можете видеть в коде, я сначала проверяю, не равна ли моя переменная lastURLSessionDataTask нулю, затем проверяю ее состояние, если она запущена, то отменяю эту задачу.

Теперь проблема в том, что он дает сбой с подробностями: [NSURLSessionDataTask state]: unrecognised selector sent to instance.

Также обратите внимание: это не приводит к сбою каждый раз, это появляется случайным образом в любое время. Я не уверен, что я делаю неправильно. Может у кого есть идеи? Кто-нибудь сталкивался с этим раньше?


person Mehul Thakkar    schedule 15.04.2019    source источник
comment
почему вы используете принудительное приведение lastURLSessionDataTask? используйте оператор защиты вместо того, чтобы делать это, если let lastSession = self.lastURLSessionDataTask, lastSession.state == running{}   -  person tryKuldeepTanwar    schedule 15.04.2019


Ответы (1)


Поскольку lastURLSessionDataTask является необязательным типом URLSessionTask, вместо Force Casting вы должны использовать оператор guard

override func viewWillDisappear(_ animated: Bool) {
    guard let task = lastURLSessionDataTask, task.state == .running else { super.viewWillDisappear(animated); return }
    task.cancel()
    task = nil
}

Или проверьте значение по

override func viewWillDisappear(_ animated: Bool) {
    if let task = lastURLSessionDataTask, task.state == .running {
        task.cancel()
        task = nil
    }
    super.viewWillDisappear(animated)
}
person tryKuldeepTanwar    schedule 15.04.2019
comment
Нет ничего плохого в принудительном приведении, поскольку первая проверка предназначена для nil, и из-за короткого замыкания остальная часть выражения будет пропущена, если lastURLSessionDataTask равно nil. - person vadian; 15.04.2019
comment
Правильно, это было предложение не использовать принудительное приведение, и это было единственное, что я считаю неправильным в этом коде. Вы нашли что-нибудь, из-за чего произошел сбой? @vadian - person tryKuldeepTanwar; 15.04.2019
comment
Нет, я этого не делал. NSURLSessionDataTask имеет свойство state. В принципе, код должен работать. - person vadian; 15.04.2019
comment
может if let task = lastURLSessionDataTask as? URLSessionTask поможет? я не знаю. - person tryKuldeepTanwar; 15.04.2019
comment
Точно, я чувствую то же самое, это должно работать, но почему это делает сбой. Кроме того, он не воспроизводится, он появляется случайным образом. - person Mehul Thakkar; 15.04.2019
comment
@dreamBegin, поскольку lastURLSessionDataTask уже имеет тип URLSessionDataTask? (который является подклассом URLSessionTask), поэтому я думаю, что это не имеет никакого смысла. - person Mehul Thakkar; 15.04.2019
comment
если вы объявили lastURLSessionDataTask как URLSessionDataTask, тогда это должно работать. - person tryKuldeepTanwar; 15.04.2019
comment
Да, именно поэтому я разместил этот вопрос, я уже достаточно искал в Google такое странное поведение, но не нашел правильного решения. - person Mehul Thakkar; 15.04.2019