Como es ampliamente conocido que una solicitud de publicación asincrónica es mejor ya que el usuario no tendrá la percepción de que la aplicación se ha "bloqueado" mientras carga el largo proceso.

Sin embargo, no estoy seguro de dónde comenzar a convertir una solicitud de publicación sincrónica en una solicitud de publicación asincrónica para un código Swift.


Tengo este código actualmente:

func checkLogin () {
    let username:NSString = txtUsername.text! as NSString
    let password:NSString = txtPassword.text! as NSString

        do {
            let post:NSString = "username=\(username)&password=\(password)" as NSString
            NSLog("PostData: %@",post);
            let url:URL = URL(string:"https://example.com/login.php")!
            let postData:Data = post.data(using: String.Encoding.ascii.rawValue)!
            let postLength:NSString = String( postData.count ) as NSString
            let request:NSMutableURLRequest = NSMutableURLRequest(url: url)

            request.httpMethod = "POST"
            request.httpBody = postData
            request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
            request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
            request.setValue("application/json", forHTTPHeaderField: "Accept")

            var reponseError: NSError?
            var response: URLResponse?
            var urlData: Data?

            do {
                urlData = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning:&response)
            } catch let error as NSError {
                reponseError = error
                urlData = nil
            }

            if ( urlData != nil ) {
                let res = response as! HTTPURLResponse!;

                NSLog("Response code: %ld", res?.statusCode);

                if ((res?.statusCode)! >= 200 && (res?.statusCode)! < 300) {
                    let responseData:NSString  = NSString(data:urlData!, encoding:String.Encoding.utf8.rawValue)!

                    NSLog("Response ==> %@", responseData);

                    let jsonData:NSDictionary = try JSONSerialization.jsonObject(with: urlData!, options:JSONSerialization.ReadingOptions.mutableContainers ) as! NSDictionary
                    let success:NSInteger = jsonData.value(forKey: "success") as! NSInteger
                    NSLog("Success: %ld", success);

                    if(success == 1)
                    {
                    // do something, code removed
                    } else {
                        var error_msg:NSString

                        if jsonData["error_message"] as? NSString != nil {
                            error_msg = jsonData["error_message"] as! NSString
                        } else {
                            error_msg = "Unknown Error"
                        }
                        // show alert  
                    }

                }
            }
        }
}
2
Panda 22 feb. 2017 a las 15:19

2 respuestas

La mejor respuesta

Realmente necesitas hacer muchos cambios. Usa el tipo rápido, en lugar de NSMutableURLRequest usa URLRequest usa String en lugar de NSString en lugar de NSDictionary y NSArray usa el diccionario y la matriz Swift

func checkLogin () {
    let username = txtUsername.text!
    let password = txtPassword.text!

    let post = "username=\(username)&password=\(password)"
    NSLog("PostData: %@",post);
    let url:URL = URL(string:"https://example.com/login.php")!
    let postData = post.data(using: .utf8)!
    let postLength = String( postData.count )
    var request = URLRequest(url: url)

    request.httpMethod = "POST"
    request.httpBody = postData
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        if error != nil {
            return
        }
        if let jsonData = (try? JSONSerialization.jsonObject(with: data!, options: [])) as? [String:Any] {
            let success = jsonData["success"] as! Int
            if success == 1 {
                //do something,
            }
            else {
                //show alert
            }
        }

    })
    task.resume()
}
1
Nirav D 22 feb. 2017 a las 12:41

En primer lugar, no use NSURLConnection ya que ahora está en desuso . En su lugar, use NSURLSession.

Simplemente puede usar así:

let task = URLSession.shared().dataTask(with: request) {
                data, response, error in
                if (data) {

                } else {
                    print("error=\(error!.localizedDescription)")
                }
            }
        task.resume()
3
Vishal Sonawane 22 feb. 2017 a las 12:25