Swift 3 URLSession.shared () Referencia ambigua al error de dataTask (con: completionHandler :) del miembro (error)

Hola, tengo código de análisis json para swift2.2, pero cuando lo uso para Swift 3.0 me da ese error

ViewController.swift: 132: 31: referencia ambigua a miembro dataTask (con: completionHandler 🙂 ‘

Mis códigos aquí

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() 

Gracias por las ideas

El comstackdor se confunde con la firma de la función. Puedes arreglarlo así:

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

Pero, tenga en cuenta que no tenemos que convertir “solicitud” como URLRequest en esta firma si se declaró anteriormente como URLRequest lugar de NSMutableURLRequest :

 var request = URLRequest(url:myUrl!) 

Esta es la conversión automática entre NSMutableURLRequest y la nueva URLRequest que está fallando y que nos obligó a hacer este casting aquí.

Has iniciado myRequest como NSMutableURLRequest , necesitas esto:

 var URLRequest 

Swift está abandonando tanto la cosa NSMutable... Solo usa var para las nuevas clases.

Xcode 8 y Swift 3.0

Usando 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() 

Llamada de delegado de 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){ } 

Usando Block 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() 

Trabajando bien para mí … pruébalo 100% garantía de resultados

Este problema es causado por URLSession tiene dos métodos 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 

El primero tiene URLRequest como parámetro, y el segundo tiene URL como parámetro, por lo que debemos especificar qué tipo llamar, por ejemplo, quiero llamar al segundo método

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

En mi caso, el error fue en NSURL

 let url = NSURL(string: urlString) 

En Swift 3 debes escribir solo URL :

 let url = URL(string: urlString) 

Probado xcode 8 versión estable; Necesita usar la variable de var request con URLRequest() Con eso puede arreglarlo fácilmente ( error )

var request = URLRequest(url:myUrl!) Y

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

Funcionó bien! Gracias chicos, creo que ayudan a muchas personas. !

  // 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() 

Para cargar datos a través de una solicitud GET, no necesita ninguna URLRequest (ni punto y coma)

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

En swift 3, el comstackdor se confunde con la firma de la función. Al especificarlo se borrará el error. También convierta la cadena de url para escribir URL. El siguiente código funcionó para mí.

  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 

Respuesta breve y concisa para 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() 

Para mí, hago esto para encontrar,

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

No puede usar

 "let url = NSURL(string: urlString) 

Para Swift 3 y 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?) } }) } } 

// Nota: siempre puedes usar el depurador para verificar el error

 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()