将 Android Volley 请求转换为 iOS NSURL 异步请求

Converting Android Volley Request to iOS NSURL asynchronous request

我的 Android 应用程序中有以下方法供用户 login/registration 使用。

public void registerUser(final String username, final String email, final String password) {
    pDialog.setMessage("Signing Up...");
    pDialog.show();

    request = new StringRequest(Method.POST, SL_URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String s) {
            pDialog.dismiss();
            String[] split = s.split("Config.php");
            String after = split[1];
            try {
                JSONObject jsonObject = new JSONObject(after);
                boolean error = jsonObject.getBoolean("error");
                if (error) {
                    String errorMsg = jsonObject.getString("error_msg");
                    Toast.makeText(getApplicationContext(),
                            errorMsg, Toast.LENGTH_LONG).show();

                } else {
                    session.setLogin(true, username, email);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            HashMap<String, String> hashMap = new HashMap<>();
            hashMap.put("tag", "login");
            hashMap.put("username", name);
            hashMap.put("password", password);
            return hashMap;
        }
    };
    queue.add(request);
}

现在我正在为 iOS 编写我的应用程序,并试图在 Swift 中复制它。到目前为止,我有以下代码:

let username = usernameTxt.text
        let password = passwordTxt.text
        let urlPath: String = "***"
        let url: NSURL = NSURL(string: urlPath)!
        let request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)

        request1.HTTPMethod = "POST"
        let stringPost="tag=login&username=" + username! + "&password=" + password! // Key and Value
        NSLog(stringPost)
        let data = stringPost.dataUsingEncoding(NSUTF8StringEncoding)

        request1.timeoutInterval = 60
        request1.HTTPBody=data
        request1.HTTPShouldHandleCookies=false

        let queue:NSOperationQueue = NSOperationQueue()

        NSURLConnection.sendAsynchronousRequest(request1, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
            do {
               var jsonResult: NSDictionary = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
            } catch _ {}

        })

现在作为 iOS 开发和 Swift 总体上的新手,我有以下问题:

  1. 在 Swift 中复制我在 Java 中使用的 progressDialog 的最佳方法是什么,它必须在请求完成之前可见,然后它应该被取消。我猜这应该放在 completionHandler 中,但是我不确定哪个 UI 元素用于进度对话框。

  2. 如何获取字符串形式的响应并复制拆分函数的行为,然后将其结果转换为 jsonObject,就像我在 Java 代码中所做的那样。

  3. 复制用于显示错误消息的 Toast 的最佳方法是什么。我认为在这里使用必须用按钮关闭的对话框不是最佳选择。

谢谢。

我也在为 Android 和 IOS 开发应用程序。在这里,我回答了我作为初学者也面临的三个问题。希望对您有所帮助。

1) 使用 MBProgressHUD Link 复制 Swift 中的 progressDialog。有两种显示和关闭 progressDialog 的方法:

在发出 HTTP 请求之前使用 showLoadingHUD()

private func showLoadingHUD() {
    let hud = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
    hud.labelText = "Loading..."
}

并在收到服务器响应后隐藏LoadingHUD()

private func hideLoadingHUD() {
    MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
}

2) 您可以使用可以处理网络内容的 Alamofire Link 并且您可以轻松地在字符串中获取响应。 示例:

 self.showLoadingHUD()
                Alamofire.request(.GET, data, parameters: nil)
                    .response { (request, response, data, error) in
                        print(data) // if you want to check data in debug window.
                        let Result = NSString(data: data!, encoding: NSUTF8StringEncoding)
                        Result!.stringByReplacingOccurrencesOfString("\"", withString: "")
                        if(newResult == "1"){
                            self.navigationController!.popViewControllerAnimated(true)
                            JLToast.makeText("Success").show()
                        }
                        else if (newResult == "0"){
                            JLToast.makeText("Failed").show()
                        }

                        self.hideLoadingHUD()

3) mankee Toas 用于短时间显示信息并自行消失。这里我们可以像Toast一样使用Android就是JLToast。在 github 可用。

JLToast.makeText("Success").show()