sendAsynchronousRequest was deprecated in iOS 9, How to alter code to fix

IosSwiftIos9

Ios Problem Overview


Below is my code I am getting the issue with:

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

This is now deprecated as of iOS 9, and is telling me to use dataTaskWithRequest instead. Can someone help me change sendAsync with dataTask, I don't know how to.

Ios Solutions


Solution 1 - Ios

Use NSURLSession instead like below,

For Objective-C

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

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

For asynchronously query, from Apple docs

> Like most networking APIs, the NSURLSession API is highly > asynchronous. It returns data in one of two ways, depending on the > methods you call: > > To a completion handler block that returns data to your app when a > transfer finishes successfully or with an error. > > By calling methods on your custom delegate as the data is received. > > By calling methods on your custom delegate when download to a file is > complete.

Solution 2 - Ios

Swift implementation

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

Solution 3 - Ios

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

Solution 4 - Ios

This is the swift 2.1 version:

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

Solution 5 - Ios

Swift 2.0:

Old (replace with New below):

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

// Code

}

New:

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

// Code

}
task.resume()

Solution 6 - Ios

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

Solution 7 - Ios

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

Solution 8 - Ios

Illustrating with an example, the alternative code to the deprecation of:

>sendAsynchronousRequest(_:queue:completionHandler:)' was deprecated in iOS 9.0: Use [NSURLSession dataTaskWithRequest:completionHandler:]

Tested and works in Swift 2.1 onwards.

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

}

//Displays an image on the ViewControllers ImageView. Connect an outlet of the ImageView

Solution 9 - Ios

Here is the SWIFT3.0 Version of Nilesh Patel's Answer with JSONSerialised data

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

Solution 10 - Ios

Swift 4.2

This worked for me:

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

I had to add "DispatchQueue.main.async { }" because I had a runtime warning, since only the main thread is supposed to modify UI elements.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDom BryanView Question on Stackoverflow
Solution 1 - IosNilesh PatelView Answer on Stackoverflow
Solution 2 - IosAnkit SachanView Answer on Stackoverflow
Solution 3 - IoskarmaView Answer on Stackoverflow
Solution 4 - Iosuser4243768View Answer on Stackoverflow
Solution 5 - IosElliott DaviesView Answer on Stackoverflow
Solution 6 - IosHaroldo GondimView Answer on Stackoverflow
Solution 7 - IosImteeView Answer on Stackoverflow
Solution 8 - IosNaishtaView Answer on Stackoverflow
Solution 9 - IosVatsal ShuklaView Answer on Stackoverflow
Solution 10 - IosMichele Dall'AgataView Answer on Stackoverflow