2017-02-22 21 views
2

Как широко известно, что асинхронный запрос сообщения лучше, поскольку пользователь не получит представление о том, что приложение «разбилось», когда оно загружает длительный процесс.Как преобразовать синхронный запрос на отправку асинхронного почтового запроса?

Однако я не знаю, с чего начать конвертировать синхронный запрос на отправку асинхронного запроса на получение кода Swift.


У меня есть этот код в настоящее время:

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 
        } 

       } 
      } 
     } 
} 

ответ

1

Вы должны действительно сделать много изменений. Используйте быстрый тип, вместо NSMutableURLRequest использования URLRequest использования String вместо NSString вместо NSDictionaryNSArray & использования 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() 
} 
3

Прежде всего не использовать NSURLConnection, как это осуждается в настоящее время. Вместо этого используйте NSURLSession.

Вы можете просто использовать, как это:

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

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

Спасибо за ваш ответ! Я не уверен, как я могу отправить свои данные и как я могу разобрать полученный JSON? – Panda

+0

@Panda Ваш запрос будет таким же, как и вы, JSON хорошо разбирался. Просто может быть немного изменений, которые вам нужно будет сделать для использования в Swift 3. Вы можете легко это сделать. Просто погрузитесь в это первое. happy Coding .. !! –

 Смежные вопросы

  • Нет связанных вопросов^_^