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