Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将同步post请求转换为异步post请求?_Ios_Swift_Asynchronous_Synchronous_Code Conversion - Fatal编程技术网

Ios 如何将同步post请求转换为异步post请求?

Ios 如何将同步post请求转换为异步post请求?,ios,swift,asynchronous,synchronous,code-conversion,Ios,Swift,Asynchronous,Synchronous,Code Conversion,众所周知,异步post请求更好,因为用户在加载长过程时不会感觉到应用程序“崩溃” 但是,对于Swift代码,我不确定从何处开始将同步post请求转换为异步post请求 我目前有以下代码: func checkLogin () { let username:NSString = txtUsername.text! as NSString let password:NSString = txtPassword.text! as NSString do {

众所周知,异步post请求更好,因为用户在加载长过程时不会感觉到应用程序“崩溃”

但是,对于Swift代码,我不确定从何处开始将同步post请求转换为异步post请求


我目前有以下代码:

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  
                    }

                }
            }
        }
}
func checkLogin(){
让用户名:NSString=txtUsername.text!作为NSString
将密码:NSString=txtPassword.text!设为NSString
做{
让我们将:NSString=“username=\(username)&password=\(password)”作为NSString发布
NSLog(“PostData:%@”,post);
让url:url=url(字符串:https://example.com/login.php")!
让postData:Data=post.Data(使用:String.Encoding.ascii.rawValue)!
将postLength:NSString=String(postData.count)设为NSString
let请求:NSMutableURLRequest=NSMutableURLRequest(url:url)
request.httpMethod=“POST”
request.httpBody=postData
setValue(postLength为字符串,forHTTPHeaderField:“内容长度”)
request.setValue(“application/x-www-form-urlencoded”,forHTTPHeaderField:“内容类型”)
request.setValue(“application/json”,forHTTPHeaderField:“Accept”)
var REPORNSERROR:NSError?
var响应:URLResponse?
var-urlData:数据?
做{
urlData=尝试NSURLConnection.sendSynchronousRequest(请求为URLRequest,返回:&响应)
}将let错误捕获为NSError{
reponserror=错误
urlData=nil
}
if(urlData!=nil){
让res=响应为!httpurresponse!;
NSLog(“响应代码:%ld”,res?.statusCode);
如果((res?.statusCode)!>=200&(res?.statusCode)!<300){
让responseData:NSString=NSString(数据:urlData!,编码:String.encoding.utf8.rawValue)!
NSLog(“响应==>%@”,响应数据);
让jsonData:NSDictionary=try JSONSerialization.jsonObject(带有:urlData!,选项:JSONSerialization.ReadingOptions.mutableContainers)作为!NSDictionary
让success:NSInteger=jsonData.value(forKey:success)作为!NSInteger
NSLog(“成功:%ld”,成功);
如果(成功==1)
{
//做点什么,删除代码
}否则{
var错误消息:NSString
如果jsonData[“错误消息”]为?NSString!=nil{
error\u msg=jsonData[“error\u message”]as!NSString
}否则{
错误\u msg=“未知错误”
}
//显示警惕
}
}
}
}
}

首先不要使用
NSURLConnection
,因为它现在已被弃用。而是使用
NSURLSession

您可以这样简单地使用:

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

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

你真的需要做很多改变。使用swift类型,而不是
NSMutableURLRequest
使用
URLRequest
使用
String
而不是
NSString
而不是
NSDictionary
NSArray
使用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()
}

谢谢你的回答!我不确定如何提交我的帖子值以及如何解析收到的JSON?@Panda您的请求将与您的请求相同,而且您已经完成了JSON解析。只是为了在Swift 3中使用,您可能需要做一些更改。你很容易做到。先深入了解一下。快乐的编码。。!!