wake-up-neo.net

sendAsynchronousRequest wurde in iOS 9 nicht mehr unterstützt. So ändern Sie den Code in Fix

Hier ist mein Code, mit dem ich das Problem bekomme:

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

Dies ist nun seit iOS 9 veraltet und gibt an, stattdessen dataTaskWithRequest zu verwenden. Kann mir jemand helfen, sendAsync mit dataTask zu ändern, ich weiß nicht wie.

46
Dom Bryan

Verwenden Sie NSURLSession stattdessen wie folgt: 

Für Ziel-C

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

  }] resume];

Für 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()

Für asynchrone Abfragen von Apple docs

Wie die meisten Netzwerk-APIs ist die NSURLSession-API hoch asynchron. Es gibt Daten auf zwei Arten zurück, abhängig von der Methoden, die Sie aufrufen:

Zu einem Abschlussbehandlungsblock, der Daten an Ihre App zurückgibt, wenn ein Die Übertragung wird erfolgreich oder mit einem Fehler beendet.

Durch Aufrufen von Methoden für Ihren benutzerdefinierten Delegaten, während die Daten empfangen werden.

Durch Aufrufen von Methoden für Ihren benutzerdefinierten Delegaten wird beim Herunterladen in eine Datei Komplett.

72
Nilesh Patel

Schnelle Implementierung

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

Dies ist die 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()
9
user4243768

Swift 2.0:

Alt (durch Neues ersetzen):

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

// Code

}

Neu:

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

// Code

}
task.resume()
4
Elliott Davies

mit 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

Hier ist die Swift3.0-Version von Nilesh Patels Answer mit JSONSerialized-Daten

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

Das hat für mich funktioniert:

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

Ich musste "DispatchQueue.main.async {}" hinzufügen, da ich eine Laufzeitwarnung hatte, da nur der Haupt-Thread UI-Elemente ändern soll.

0

Mit einem Beispiel soll der alternative Code zur Abschreibung von dargestellt werden:

sendAsynchronousRequest (_: queue: completionHandler :) 'wurde in iOS 9.0 nicht mehr weiterentwickelt.

Getestet und arbeitet ab 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()

    }

}

// Zeigt ein Bild in der ViewControllers ImageView an. Schließen Sie eine Steckdose des ImageView an

0
Naishta