Swift 3 URLSession.shared()成员'dataTask的模糊引用(with:completionHandler :) error(bug)

你好,我有工作jsonparsing代码为swift2.2,但是当我使用它的Swift 3.0给我这个错误

ViewController.swift:132:31:对成员dataTask的模糊引用(with:completionHandler :)'

我的代码在这里

let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex) let myUrl = URL(string: listUrlString); let request = NSMutableURLRequest(url:myUrl!); request.httpMethod = "GET"; let task = URLSession.shared().dataTask(with: request) { data, response, error in if error != nil { print(error!.localizedDescription) DispatchQueue.main.sync(execute: { AWLoader.hide() }) return } do { let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray if let parseJSON = json { var items = self.categoryList items.append(contentsOf: parseJSON as! [String]) if self.fromIndex < items.count { self.categoryList = items self.fromIndex = items.count DispatchQueue.main.async(execute: { self.categoriesTableView.reloadData() AWLoader.hide() }) }else if( self.fromIndex == items.count){ DispatchQueue.main.async(execute: { AWLoader.hide() }) } } } catch { AWLoader.hide() print(error) } } task.resume() 

感谢您的想法。

编译器被函数签名弄糊涂了。 你可以像这样解决它:

 let task = URLSession.shared.dataTask(with: request as URLRequest) { 

但是,请注意, 如果URLRequest而不是NSMutableURLRequest声明URLRequest ,那么我们不必在URLRequest中input“request”。

 var request = URLRequest(url:myUrl!) 

这是NSMutableURLRequest和失败的新URLRequest之间的自动转换,这迫使我们在这里进行转换。

你已经init'd myRequest作为NSMutableURLRequest ,你需要这个:

 var URLRequest 

Swift正在抛弃NSMutable...东西。 只需使用var为新的类。

Xcode 8和Swift 3.0

使用URLSession:

  let url = URL(string:"Download URL")! let req = NSMutableURLRequest(url:url) let config = URLSessionConfiguration.default let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main) let task : URLSessionDownloadTask = session.downloadTask(with: req as URLRequest) task.resume() 

URLSession委托调用:

 func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten writ: Int64, totalBytesExpectedToWrite exp: Int64) { print("downloaded \(100*writ/exp)" as AnyObject) } func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){ } 

使用阻止GET / POST / PUT / DELETE:

  let request = NSMutableURLRequest(url: URL(string: "Your API URL here" ,param: param))!, cachePolicy: .useProtocolCachePolicy, timeoutInterval:"Your request timeout time in Seconds") request.httpMethod = "GET" request.allHTTPHeaderFields = headers as? [String : String] let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest) {data,response,error in let httpResponse = response as? HTTPURLResponse if (error != nil) { print(error) } else { print(httpResponse) } DispatchQueue.main.async { //Update your UI here } } dataTask.resume() 

为我工作好,试试100%的结果保证

这个问题是由URLSession有两个dataTask方法引起的

 open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask 

第一个URLRequest作为参数,第二个URL作为参数,所以我们需要指定要调用的types,例如,我想调用第二个方法

 let task = URLSession.shared.dataTask(with: url! as URL) { data, response, error in // Handler } 

经过testing的xcode 8稳定版本; 需要与URLRequest()使用var requestvariables用这个,你可以很容易地修复( 错误

var request = URLRequest(url:myUrl!)

 let task = URLSession.shared().dataTask(with: request as URLRequest) { } 

工作很好! 谢谢你们,我觉得帮助很多人。 !

  // prepare json data let mapDict = [ "1":"First", "2":"Second"] let json = [ "title":"ABC" , "dict": mapDict ] as [String : Any] let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData // create post request let url = NSURL(string: "http://httpbin.org/post")! let request = NSMutableURLRequest(url: url as URL) request.httpMethod = "POST" // insert json data to the request request.httpBody = jsonData as Data let task = URLSession.shared.dataTask(with: request as URLRequest){ data,response,error in if error != nil{ return } do { let result = try JSONSerialization.jsonObject(with: data!, options: []) as? [String:AnyObject] print("Result",result!) } catch { print("Error -> \(error)") } } task.resume() 

要通过GET请求加载数据,您不需要任何URLRequest (也不需要分号)

 let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex) let myUrl = URL(string: listUrlString)! let task = URLSession.shared.dataTask(with: myUrl) { ... 

在swift 3中,编译器被函数签名弄糊涂了。 指定它将清除错误。 还要将urlstring转换为URLtypes。 下面的代码为我工作。

  let urlString = "http://bla.com?batchSize=" let pathURL = URL(string: urlString)! var urlRequest = URLRequest(url:pathURL) let session = URLSession.shared let dataTask = session.dataTask(with: urlRequest as URLRequest) { (data,response,error) in 

在我的情况下错误是在NSURL

 let url = NSURL(string: urlString) 

在Swift 3中,你必须写下URL

 let url = URL(string: urlString) 

对我来说,我这样做是为了find,

 let url = URL(string: urlString) URLSession.shared.dataTask(with: url!) { (data, response, error) in ...} 

不能使用

 "let url = NSURL(string: urlString) 
 let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { data,response,error in if error != nil{ print(error!.localizedDescription) return } if let responseJSON = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? [String:AnyObject]{ if let response_token:String = responseJSON["token"] as? String { print("Singleton Firebase Token : \(response_token)") completion(response_token) } } }) task.resume() 

简短的回答Swift 3:

 guard let requestUrl = URL(string: yourURL) else { return } let request = URLRequest(url:requestUrl) URLSession.shared.dataTask(with: request) { (data, response, error) in ... }.resume() 

对于Swift 3和Xcode 8:

  var dataTask: URLSessionDataTask? if let url = URL(string: urlString) { self.dataTask = URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in if let error = error { print(error.localizedDescription) } else if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 { // You can use data received. self.process(data: data as Data?) } }) } } 

//注意:你总是可以使用debugging器来检查错误