Swift 3 URLSession.shared () Référence ambiguë à dataTask du membre (avec: completionHandler :) erreur (bug)

Bonjour, j'ai un code d'parsing json pour swift2.2, mais quand je l'utilise pour Swift 3.0, cela me donne cette erreur

ViewController.swift: 132: 31: Référence ambiguë à dataTask du membre (avec: completionHandler 🙂 '

Mes codes ici

let listUrlSsortingng = "http://bla.com?batchSize=" + Ssortingng(batchSize) + "&fromIndex=" + Ssortingng(fromIndex) let myUrl = URL(ssortingng: listUrlSsortingng); 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! [Ssortingng]) 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() 

Merci pour les idées.

Le compilateur est confus par la signature de la fonction. Vous pouvez le réparer comme ceci:

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

Mais, notez que nous n'avons pas besoin de lancer "request" comme URLRequest dans cette signature si elle a été déclarée précédemment comme URLRequest au lieu de NSMutableURLRequest :

 var request = URLRequest(url:myUrl!) 

C'est le casting automatique entre NSMutableURLRequest et la nouvelle URLRequest qui échoue et qui nous a forcé à faire ce casting ici.

Vous avez init_d myRequest sous NSMutableURLRequest , vous en avez besoin:

 var URLRequest 

Swift est en train d'abandonner la chose NSMutable... Utilisez simplement var pour les nouvelles classs.

Xcode 8 et Swift 3.0

En utilisant URLSession:

  let url = URL(ssortingng:"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() 

Appel de délégué 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){ } 

À l'aide de Block GET / POST / PUT / DELETE:

  let request = NSMutableURLRequest(url: URL(ssortingng: "Your API URL here" ,param: param))!, cachePolicy: .useProtocolCachePolicy, timeoutInterval:"Your request timeout time in Seconds") request.httpMethod = "GET" request.allHTTPHeaderFields = headers as? [Ssortingng : Ssortingng] 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() 

Fonctionne bien pour moi .. l'essayer 100% résultat garantie

Ce problème est dû à URLSession a deux methods 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 

Le premier a URLRequest comme paramètre, et le second a l' URL comme paramètre, nous devons donc spécifier quel type appeler, par exemple, je veux appeler la deuxième méthode

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

Testé xcode 8 version stable; Besoin d'utiliser la variable var request avec URLRequest() Avec thats vous pouvez facilement résoudre ce problème ( bug )

var request = URLRequest(url:myUrl!) Et

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

J'ai bien travaillé! Merci les gars, je pense aider beaucoup de gens. !

Dans mon cas, l'erreur était dans NSURL

 let url = NSURL(ssortingng: urlSsortingng) 

Dans Swift 3, vous devez écrire juste l' URL :

 let url = URL(ssortingng: urlSsortingng) 
  // prepare json data let mapDict = [ "1":"First", "2":"Second"] let json = [ "title":"ABC" , "dict": mapDict ] as [Ssortingng : Any] let jsonData : NSData = NSKeyedArchiver.archivedData(withRootObject: json) as NSData // create post request let url = NSURL(ssortingng: "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? [Ssortingng:AnyObject] print("Result",result!) } catch { print("Error -> \(error)") } } task.resume() 

Pour charger des données via une requête GET, vous n'avez pas besoin d' URLRequest (et pas de point-virgule)

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

Dans swift 3, le compilateur est confondu par la signature de la fonction. La spécifier effacera l'erreur. Convertissez également la string d'URL en type URL. Le code suivant a fonctionné pour moi.

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

Pour moi, je fais ça pour find,

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

Ne peut pas utiliser

 "let url = NSURL(ssortingng: urlSsortingng) 
 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? [Ssortingng:AnyObject]{ if let response_token:Ssortingng = responseJSON["token"] as? Ssortingng { print("Singleton Firebase Token : \(response_token)") completion(response_token) } } }) task.resume() 

Réponse courte et concise pour Swift 3:

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

Pour Swift 3 et Xcode 8:

  var dataTask: URLSessionDataTask? if let url = URL(ssortingng: urlSsortingng) { 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?) } }) } } 

// Note: Vous pouvez toujours utiliser le débogueur pour vérifier l'erreur