如何在 Swift 2 中使用 NSURLSession 的 dataTaskWithURL?
Posted
技术标签:
【中文标题】如何在 Swift 2 中使用 NSURLSession 的 dataTaskWithURL?【英文标题】:How to use NSURLSession's dataTaskWithURL with Swift 2? 【发布时间】:2015-06-19 06:30:41 【问题描述】:在使用 Swift 1 时,这段代码运行良好:
let connectionSession = NSURLSession.sharedSession()
let task = connectionSession.dataTaskWithURL(currentURL!, completionHandler: (data, response , error) in
...
在 Swift 2 中,我收到以下编译器错误:
'(_, _, _) throws 类型的抛出函数的无效转换 -> _' 到非抛出函数类型 '(NSData?, NSURLResponse?, NSError?) -> Void'
我该如何解决这个问题?
【问题讨论】:
Swift 1 中没有try
,帽子代码怎么能正常工作?
Ups,我正在从我的一个实验中复制...现在问题已解决。
task!.resume() 已用于 Swift 1
该代码片段在 Swift 2 中不会导致编译器错误。问题可能出在完成处理程序中。请展示一个(小)完整的独立示例来说明问题。
@MartinR 宾果游戏!我在 try/catch 内部遇到了问题。干杯!
【参考方案1】:
要在完成处理程序中使用NSJSONSerialization.JSONObjectWithData
,您需要捕获错误:
do
var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
// Do Stuff
catch
// handle error
【讨论】:
【参考方案2】:你可以使用这样的可选值
var task = session.dataTaskWithURL(url!)
(NSData?, NSURLResponse?, NSError?) throws -> Void
do
var jsonData = try NSJSONSerialization.JSONObjectWithData(data!,options: .MutableContainers) as! NSArray
catch
// handle error
task!.resume()
【讨论】:
【参考方案3】:正如@MartinR 指出的那样,事实证明问题不在于调用 NSURLSession 的 dataTaskWithURL,而在于完成处理程序的深处(更具体地说,是在 Swift 1 -> Swift 2 转换“尝试”期间添加的一个没有相应的捕获)。我看到其他人也有类似的问题(个人博客中的问题),并将向 Swift 人员提交增强请求以获得更好的错误描述。
【讨论】:
【参考方案4】:在 Swift 2、XCode 7 中,Apple 在几个 API(不是全部)中将 NSError 替换为 ErrorType。
您可能在自己的代码中明确使用 NSError。用 Apple 使用 ErrorType 的 ErrorType 替换您自己的 NSError 用法。
【讨论】:
以上是关于如何在 Swift 2 中使用 NSURLSession 的 dataTaskWithURL?的主要内容,如果未能解决你的问题,请参考以下文章