2017-02-22 5 views
2

Es ist allgemein bekannt, dass eine asynchrone Postanforderung besser ist, da der Benutzer keine Vorstellung davon bekommt, dass die App "abgestürzt" ist, während sie den langen Prozess lädt.Wie kann ich eine synchrone Postanforderung in eine asynchrone Postanforderung konvertieren?

Ich bin mir jedoch nicht sicher, wo ich anfangen soll, eine synchrone Postanforderung in eine asynchrone Postanforderung für einen Swift-Code zu konvertieren.


Ich habe diesen Code zur Zeit:

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 
        } 

       } 
      } 
     } 
} 

Antwort

1

Sie müssen wirklich eine Menge Änderungen vornehmen. Verwenden Sie schnellen Art, statt NSMutableURLRequest Verwendung URLRequest Verwendung String statt NSString statt NSDictionary & NSArray Verwendung Swift Wörterbuch und Array

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

allererst nicht NSURLConnection verwenden, da es jetzt veraltet ist. Verwenden Sie stattdessen NSURLSession.

Sie können einfach wie folgt verwenden:

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

       } else { 
        print("error=\(error!.localizedDescription)") 
       } 
      } 
     task.resume() 
+0

Vielen Dank für Ihre Antwort! Ich bin mir nicht sicher, wie ich meine Post-Werte übermitteln kann und wie ich den empfangenen JSON parsen kann. – Panda

+0

@Panda Ihre Anfrage wird gleich sein, auch Sie haben JSON Parsing gut gemacht. Es gibt nur wenige Änderungen, die Sie vornehmen müssen, um in Swift 3 zu verwenden. Sie können das problemlos tun. Tauchen Sie einfach in dieses erste ein. Glückliche Kodierung .. !! –

Verwandte Themen