将 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 总体上的新手,我有以下问题:
在 Swift 中复制我在 Java 中使用的 progressDialog 的最佳方法是什么,它必须在请求完成之前可见,然后它应该被取消。我猜这应该放在 completionHandler 中,但是我不确定哪个 UI 元素用于进度对话框。
如何获取字符串形式的响应并复制拆分函数的行为,然后将其结果转换为 jsonObject,就像我在 Java 代码中所做的那样。
复制用于显示错误消息的 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()
我的 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 总体上的新手,我有以下问题:
在 Swift 中复制我在 Java 中使用的 progressDialog 的最佳方法是什么,它必须在请求完成之前可见,然后它应该被取消。我猜这应该放在 completionHandler 中,但是我不确定哪个 UI 元素用于进度对话框。
如何获取字符串形式的响应并复制拆分函数的行为,然后将其结果转换为 jsonObject,就像我在 Java 代码中所做的那样。
复制用于显示错误消息的 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()