【问题标题】:iOS Crash saying : [NSURLSessionDataTask state]: unrecognised selector sent to instanceiOS Crash 说:[NSURLSessionDataTask state]: unrecognized selector sent to instance
【发布时间】:2019-04-15 05:59:40
【问题描述】:

我有一个带有搜索栏的屏幕,当我离开这个屏幕时,我只是取消了正在运行的 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。

还要注意:它不是每次都崩溃,这会在任何时候随机出现。我不确定,我做错了什么。任何人都可以有任何想法吗?之前有人遇到过这种情况吗?

【问题讨论】:

  • 为什么要使用强制转换 lastURLSessionDataTask?使用保护语句而不是 if let lastSession = self.lastURLSessionDataTask, lastSession.state == running{}

标签: ios swift nsurlsession nsurlsessiondatatask


【解决方案1】:

因为 lastURLSessionDataTask 是URLSessionTask 的可选类型,所以您应该使用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)
}

【讨论】:

  • 强制转换没有任何问题,因为第一次检查是针对nil,并且由于短路评估,如果lastURLSessionDataTask 是nil,则表达式的其余部分将被跳过。
  • 正确,建议不要使用强制转换,这是我在这段代码中发现的唯一错误。你有没有发现任何导致崩溃发生的事情@vadian
  • 不,我没有。 NSURLSessionDataTask 确实有 state 属性。基本上代码应该可以工作。
  • 也许if let task = lastURLSessionDataTask as? URLSessionTask 会有所帮助?我不知道。
  • 没错,我也有同感,它必须工作,但为什么它会导致崩溃。此外,它不可重现,它是随机出现的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多