recorrer jsonserialization array ios json swift3

ios - jsonserialization - recorrer json swift



Swift 3 URLSession.shared() Referencia ambigua a la dataTask del miembro(con: completeHandler:) error(error) (14)

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

ViewController.swift: 132: 31: referencia ambigua al miembro ''dataTask (con: completeHandler :)''

Mis codigos aqui

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


Xcode 10.1 Swift 4

Esto funcionó para mí:

let task: URLSessionDataTask = session.dataTask(with: request as URLRequest) { (data, response, error) -> Void in ...

La clave se agregaba en la declaración de tipo URLSessionDataTask .


El compilador está confundido por 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 emitir "solicitud" como URLRequest en esta firma si se declaró anteriormente como URLRequest lugar de NSMutableURLRequest :

var request = URLRequest(url:myUrl!)

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


En mi caso el error estaba en NSURL

let url = NSURL(string: urlString)

En Swift 3 debe escribir solo la URL :

let url = URL(string: urlString)


En swift 3, el compilador 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


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 a 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 }


Ha iniciado myRequest como NSMutableURLRequest , necesita esto:

var URLRequest

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


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 puede usar el depurador para verificar el error


Para cargar datos a través de una solicitud GET, no necesita ninguna URLRequest (y no 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) { ...


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)


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


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

var request = URLRequest(url:myUrl!) Y

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

Funcionó bien! Gracias chicos, creo que ayuda a mucha gente. !


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

Funciona bien para mí ... pruébalo 100% de garantía de resultados


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


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