dataTask 在展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】dataTask 在展开可选值时意外发现 nil【英文标题】:dataTask Unexpectedly found nil while unwrapping an Optional value 【发布时间】:2020-03-24 01:41:21 【问题描述】:

我正在构建一个只使用 Web 服务的应用程序。为此,我使用了方法 dataTask (URLSession.shared.dataTask)。

我不是在等待信息,只是用下一个代码触发了一个进程:

let endPoint = "http://host/service

let url = URL(string: endPoint)

let task = URLSession.shared.dataTask(with: url!) _, _, _ in


task.resume()

当方法 dataTask 执行时,Xcode 显示错误:

“线程 1:致命错误:在展开可选值时意外发现 nil”

有没有办法跳过返回completionHandler(数据、响应、错误)?

【问题讨论】:

显示您的端点 url 字符串值。您需要正确地对字符串进行百分比编码。 ***.com/a/43668198/2303865的可能重复 【参考方案1】:

需要完成处理程序,但不必在创建数据任务对象时指定。在这种情况下,您必须定义一个处理响应的 URLSessionDataDelegate。

“一个 URLSession 对象不需要有委托。如果没有分配委托,当您在该会话中创建任务时,您必须提供一个完成处理程序块来获取数据。

完成处理程序块主要用作使用自定义委托的替代方案。如果您使用采用完成处理程序块的方法创建任务,则不会调用响应和数据传递的委托方法。” (https://developer.apple.com/documentation/foundation/urlsessiondatadelegate)。

至于崩溃,它似乎与声明任务时使用的强制展开(!符号)有关。如果发生此错误,您可以使用保护条件安全中止。

guard let url = URL(string: endPoint) else  return 

URLSession.shared.dataTask(with: url) _, _, _ in
.resume() 

【讨论】:

谢谢@folverap 我可以解决这个问题。有没有办法调试或检查 dataTask 是否运行?如果我在浏览器或邮递员中执行我的 WebService,则该响应正常,但是当我尝试在我的代码中执行时,什么也没有发生。 您为此使用了完成块(Data?, URLResponse?, Error?)。如果 Error 不为零,则请求失败。如果成功,errir 将为 nil,并且您的 Data 对象不应为 nil。

以上是关于dataTask 在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:在展开可选值时意外发现 nil - 为啥?

Alamofire:在展开可选值时意外发现 nil

Swift 错误致命错误:在展开可选值时意外发现 nil

Alamofire 平面错误:在展开可选值时意外发现 nil

prepareForSegue 出错“”在展开可选值时意外发现 nil“”

@IBInspectable 致命错误:在展开可选值时意外发现 nil