ios swift ios9

sendAsynchronousRequest quedó en desuso en iOS 9, Cómo modificar el código para corregir



swift ios9 (10)

Debajo está mi código con el que estoy recibiendo el problema:

func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void) { NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, error) -> Void in if ((error) != nil) { callback(feed: nil, error: error) } else { self.callbackClosure = callback let parser : NSXMLParser = NSXMLParser(data: data!) parser.delegate = self parser.shouldResolveExternalEntities = false parser.parse() } } }

Esto ahora está obsoleto a partir de iOS 9, y me dice que use dataTaskWithRequest en su lugar. ¿Alguien puede ayudarme a cambiar sendAsync con dataTask, no sé cómo hacerlo?


Aquí está la versión SWIFT3.0 de la respuesta de Nilesh Patel con datos JSONSerializados

let url = URL(string: "<HERE GOES SERVER API>")! var request = URLRequest(url: url) request.httpMethod = "POST" //GET OR DELETE etc.... request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("<ValueforAuthorization>", forHTTPHeaderField: "Authorization") let parameter = [String:Any]() //This is your parameters [String:Any] do { let jsonData = try JSONSerialization.data(withJSONObject: parameter, options: .prettyPrinted) // here "jsonData" is the dictionary encoded in JSON data request.httpBody = jsonData let session = URLSession(configuration: .default) let task = session.dataTask(with: request, completionHandler: { (incomingData, response, error) in if let error = error { print(error.localizedDescription) print(request) }else if let response = response { print(response) }else if let incomingData = incomingData { print(incomingData) } }) task.resume() } catch { print(error.localizedDescription) }


Esta es la versión rápida 2.1:

let request = NSMutableURLRequest(URL: NSURL(string: "YOUR URL")!) let session = NSURLSession.sharedSession() request.HTTPMethod = "POST" let params = ["username":"username", "password":"password"] as Dictionary<String, String> request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(params, options: []) request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in print("Response: /(response)")}) task.resume()


Ilustrando con un ejemplo, el código alternativo a la anulación de:

sendAsynchronousRequest (_: queue: completionHandler :) ''está en desuso en iOS 9.0: Use [NSURLSession dataTaskWithRequest: completionHandler:]

Probado y funciona en Swift 2.1 en adelante.

import UIKit class ViewController: UIViewController { @IBOutlet var theImage: UIImageView! override func viewDidLoad() { super.viewDidLoad() let url = NSURL(string: "https://upload.wikimedia.org/wikipedia/commons/6/6a/Johann_Sebastian_Bach.jpg") let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) -> Void in if error != nil { print("thers an error in the log") } else { dispatch_async(dispatch_get_main_queue()) { let image = UIImage(data: data!) self.theImage.image = image } } } task.resume() } }

// Muestra una imagen en ViewControllers ImageView. Conecte una salida de ImageView


Implementación rápida

let session = NSURLSession.sharedSession() session.dataTaskWithRequest(request) { (data, response, error) -> Void in }


Swift 3.0

var request = URLRequest(url: URL(string: "http://example.com")!) request.httpMethod = "POST" let session = URLSession.shared session.dataTask(with: request) {data, response, err in print("Entered the completionHandler") }.resume()


Use NSURLSession en NSURLSession lugar como a continuación,

Para Objective-C

NSURLSession *session = [NSURLSession sharedSession]; [[session dataTaskWithURL:[NSURL URLWithString:"YOUR URL"] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { // handle response }] resume];

Para Swift,

var request = NSMutableURLRequest(URL: NSURL(string: "YOUR URL")!) var session = NSURLSession.sharedSession() request.HTTPMethod = "POST" var params = ["username":"username", "password":"password"] as Dictionary<String, String> request.HTTPBody = try? NSJSONSerialization.dataWithJSONObject(params, options: []) request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in print("Response: /(response)")}) task.resume()

Para consulta asíncrona, de Apple docs

Al igual que la mayoría de las API de red, NSURLSession API es altamente asincrónica. Devuelve datos de una de dos maneras, dependiendo de los métodos que llame:

A un bloque de controlador de finalización que devuelve datos a su aplicación cuando una transferencia finaliza con éxito o con un error.

Llamando a métodos en su delegado personalizado a medida que se reciben los datos.

Llamando a métodos en su delegado personalizado cuando se completa la descarga a un archivo.


con veloz 3.1

let request = NSMutableURLRequest(url: NSURL(string: image_url_string)! as URL) let session = URLSession.shared request.httpMethod = "POST" let params = ["username":"username", "password":"password"] as Dictionary<String, String> request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: []) request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in print("Response: /(String(describing: response))")}) task.resume()


Swift 2.0:

Viejo (reemplace con Nuevo a continuación):

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue()) { (response, data, error) -> Void in // Code }

Nuevo:

let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in // Code } task.resume()


Swift 4.2

Esto funcionó para mí:

func loadImageFromURL(URL: NSURL) { let request = URLRequest(url: URL as URL) let task = URLSession.shared.dataTask(with: request) { (data, response, error) in if let imageData = data { DispatchQueue.main.async { self.imageView.image = UIImage(data: imageData) } } } task.resume() }

Tuve que agregar "DispatchQueue.main.async {}" porque tenía una advertencia de tiempo de ejecución, ya que solo el hilo principal se supone que modifica los elementos de la IU.


Swift 4

let params = ["email":"[email protected]", "password":"123456"] as Dictionary<String, String> var request = URLRequest(url: URL(string: "http://localhost:8080/api/1/login")!) request.httpMethod = "POST" request.httpBody = try? JSONSerialization.data(withJSONObject: params, options: []) request.addValue("application/json", forHTTPHeaderField: "Content-Type") let session = URLSession.shared let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in do { let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject> print(json) } catch { print("error") } }) task.resume()