Swift 2 NSURLSession.sharedSession()。dataTaskWithURL无法使用

时间:2015-06-16 10:37:35

标签: swift2 xcode7

似乎无法使用Xcode 7编译以下代码,我收到错误"无法调用' dataTaskWithURL'使用类型"

的参数列表

看起来completionHandler不再是可选的,无法弄清楚如何重写以下代码。任何帮助表示感谢,谢谢

    let session = NSURLSession.sharedSession()
    let url = NSURL(string: urlString)

    var task = session.dataTaskWithURL(url!) {
        (data, response, error) -> Void in

        if error != nil {
            print(error!.localizedDescription)
        }
        else {
            var error: NSError?

            var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
            // Do Stuff
        }
    }

    task!.resume()

3 个答案:

答案 0 :(得分:9)

编译器抛出以下错误:

  

/Users/Xcode/Desktop/fdsfsdfds/fdsfsdfds/AppDelegate.swift:24:28:   无法使用类型'的参数列表调用'dataTaskWithURL'(NSURL,   (_,_,_)抛出 - >空隙)'

completionHandler 中,您没有捕获JSONObjectWithData最终可能抛出的异常。因此,编译器推断您正在尝试传播异常,这将要求completionHandler具有以下签名:

(NSData?, NSURLResponse?, NSError?) throws -> Void

这与实际 completionHandler dataTaskWithURL期待的错误相匹配。

要解决此问题,只需将您对NSJSONSerialization.JSONObjectWithData的调用包装为do / catch语句,如下所示即可处理错误:

do {
    var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
    // Do Stuff

} catch {
    // handle error
}

有关Swift2中有关错误处理的更多信息,请参阅可用的预发布文档here

答案 1 :(得分:2)

从Swift 2.0(Xcode 7 beta 6)开始,像这样使用dataTaskWithURL()

var task = session.dataTaskWithURL(url!, completionHandler: {
   (data, response, error) -> Void in

   :
})
task.resume()

要在完成处理程序中使用NSJSONSerialization.JSONObjectWithData,您还需要捕获错误:

    do {
        var jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray
        // Do Stuff
    } catch {
        // handle error
    }

答案 2 :(得分:1)

let url : String = String(format: "http://api.nytimes.com/svc/news/v3/content/nyt/all/720.json?api-key=%@",apiKey)
        let url1: NSURL = NSURL(string: url)!
      let session = NSURLSession.sharedSession()
        let task1 = session.dataTaskWithURL(url1, completionHandler: {
            (data, response, error) -> Void in
                        do {
                         if data == nil {
                    return
                }
                else
                {

                let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSDictionary
                self.dict = jsonData;
                self.array1 = (self.dict.objectForKey("results") as? NSMutableArray)!
                dispatch_async(dispatch_get_main_queue()) {
                    self.table.reloadData()
                }

                }

            } catch {

            }

        })