web-dev-qa-db-fra.com

sendAsynchronousRequest est obsolète dans iOS 9, Modification du code pour y remédier

Vous trouverez ci-dessous le code avec lequel je reçois le problème:

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

Il est maintenant obsolète depuis iOS 9 et me dit d’utiliser plutôt dataTaskWithRequest. Quelqu'un peut-il m'aider à changer sendAsync avec dataTask, je ne sais pas comment.

46
Dom Bryan

Utilisez NSURLSession à la place comme ci-dessous, 

Pour Objective-C

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

  }] resume];

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

Pour une requête asynchrone, à partir de Apple docs

Comme la plupart des API de réseau, l’API NSURLSession est hautement asynchrone. Il renvoie les données de deux manières, selon le méthodes que vous appelez:

Vers un bloc de gestionnaire d'achèvement qui renvoie des données à votre application lorsqu'un fichier le transfert se termine avec succès ou avec une erreur.

En appelant des méthodes sur votre délégué personnalisé lors de la réception des données.

En appelant des méthodes sur votre délégué personnalisé lorsque le téléchargement dans un fichier est Achevée.

72
Nilesh Patel

Mise en œuvre rapide

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

}
15
Ankit Sachan

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

Ceci est la version Swift 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()
9
user4243768

Swift 2.0:

Ancien (remplacer par Nouveau ci-dessous):

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

// Code

}

Nouveau:

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

// Code

}
task.resume()
4
Elliott Davies

avec Swift 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()
1
Imtee

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()
0
Haroldo Gondim

Voici la version Swift3.0 de La réponse de Nilesh Patel avec des données JSONSerialised

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)
            }
0
Vats

Swift 4.2

Cela a fonctionné pour moi:

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

J'ai dû ajouter "DispatchQueue.main.async {}" car j'avais un avertissement à l'exécution, car seul le thread principal est supposé modifier les éléments de l'interface utilisateur.

0
Michele Dall'Agata

Illustrant par un exemple, le code alternatif à la dépréciation de:

sendAsynchronousRequest (_: queue: completionHandler :) 'est obsolète dans iOS 9.0: utilisez [NSURLSession dataTaskWithRequest: completionHandler]

Testé et fonctionne à partir de Swift 2.1.

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

    }

}

// Affiche une image sur le ViewControllers ImageView. Connectez une prise de la ImageView

0
Naishta