"dataTaskWithRequest" 当只需要一个请求时请求 NSMutableRequest 两次
"dataTaskWithRequest" requests the NSMutableRequest twice when only one request is required
我有一个安全的 webView,它显示客户加载他的钱包。我传递安全信息 MPIN(如一次性密码)。
有问题
@IBOutlet weak var loading: UIActivityIndicatorView!
@IBOutlet var lblLoading: UILabel!
@IBOutlet weak var mob_webview: UIWebView!
override func viewDidLoad()
{
super.viewDidLoad()
mob_webview.hidden = true
mob_webview.delegate=self
cmmn.createDatabase()
linkgot = cmmn.geturl()
link="http://*****************************************.jsp?"
let request = NSMutableURLRequest(URL: NSURL(string: link)!)
request.HTTPMethod = "POST"
let postString = "recharge_type=\(_catcode)&amount=\(_amountfiled_got)&mobileNo=\(cmmn.getPhoneNumber())&prePostLan=\(prePostLan)&stdCode=\(_stdCode)&accNo=\(accNo)&deduct_frm=B&rcMobileNum=\(_numberfiled_got)&mobOperator=\(_merch_code)&operator=\(_operatr)&rcType=\(_rec_type)&mpin=\(_mpin)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
print("response = \(response)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
}
task.resume()
mob_webview.loadRequest(request)
// Do any additional setup after loading the view.
}
func webViewDidFinishLoad(webView_Pages: UIWebView)
{
mob_webview.hidden = false
loading.hidden = true
lblLoading.hidden=true
print("OK")
}
服务器日志中的响应:
在服务器端,如果用户输错3次MPIN,就会被屏蔽。这是根据服务器中错误的 MPIN 命中数来完成的。出于某种原因,我的网络视图发出了两次请求(即调用 link 两次加载请求),即使它只加载 once.Suppose 如果客户输入错误的 MPIN 并加载网络视图, link 被调用两次,他失去了 2 次输入正确 MPIN 的机会。 android 版本的 APP 可以正常运行,原因与 request.Any 类似?
看完你的问题后,我浏览了苹果参考文档。它说 webViewDidFinishLoad
在 webview 中加载每个帧后被调用。 Here is document
webViewDidFinishLoad: Sent after a web view finishes loading a frame.
请与服务器核实,一个 运行 有多少请求。它是 2 或 1。还想知道代码中的打印语句执行了多少次print("response = \(response)")
。因为我不同意这种说法。
在您的问题中发现您调用了 NSURLSession dataTaskWithRequest 并且还在 Web 视图中加载了请求。两次调用同一事物也可能会出现问题。如果你想在 webview 中打开请求,请不要使用 NSURLSession 任务请求。 运行 通过评论 task.resume()
.
您请求 NSMutableURLRequest
两次:
- 您将它传递给
URLSession
的 dataTaskWithRequest 方法。此方法 returns 数据来自您请求中的 URL 闭包。
- 您将其传递给
UIWebView
的 loadRequest 方法。此方法在您的 UIWebView
(您的 mob_webview
IBOutlet)中加载您请求的 URL 处的内容。
要解决此问题,您需要删除 URLSession
代码或 UIWebView
代码。你删除哪个取决于你想对服务器的响应做什么 - 你想要它作为数据还是你想在 webview 中加载它?如果你想把它作为数据,你应该使用 URLSession
并删除 UIWebView
loadRequest
。如果你想在 webview 中加载它,那么你应该使用 UIWebView
并删除任何 UISession
代码。
如果是您需要删除的 URLSession
代码,您应该删除以下所有代码:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
print("response = \(response)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
}
task.resume()
task.resume() 和 mob_webview.loadRequest(request) 将 运行 请求两次。
你最好在 loadRequest 之前删除 task.resume()。
我有一个安全的 webView,它显示客户加载他的钱包。我传递安全信息 MPIN(如一次性密码)。
有问题@IBOutlet weak var loading: UIActivityIndicatorView!
@IBOutlet var lblLoading: UILabel!
@IBOutlet weak var mob_webview: UIWebView!
override func viewDidLoad()
{
super.viewDidLoad()
mob_webview.hidden = true
mob_webview.delegate=self
cmmn.createDatabase()
linkgot = cmmn.geturl()
link="http://*****************************************.jsp?"
let request = NSMutableURLRequest(URL: NSURL(string: link)!)
request.HTTPMethod = "POST"
let postString = "recharge_type=\(_catcode)&amount=\(_amountfiled_got)&mobileNo=\(cmmn.getPhoneNumber())&prePostLan=\(prePostLan)&stdCode=\(_stdCode)&accNo=\(accNo)&deduct_frm=B&rcMobileNum=\(_numberfiled_got)&mobOperator=\(_merch_code)&operator=\(_operatr)&rcType=\(_rec_type)&mpin=\(_mpin)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
print("response = \(response)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
}
task.resume()
mob_webview.loadRequest(request)
// Do any additional setup after loading the view.
}
func webViewDidFinishLoad(webView_Pages: UIWebView)
{
mob_webview.hidden = false
loading.hidden = true
lblLoading.hidden=true
print("OK")
}
服务器日志中的响应:
在服务器端,如果用户输错3次MPIN,就会被屏蔽。这是根据服务器中错误的 MPIN 命中数来完成的。出于某种原因,我的网络视图发出了两次请求(即调用 link 两次加载请求),即使它只加载 once.Suppose 如果客户输入错误的 MPIN 并加载网络视图, link 被调用两次,他失去了 2 次输入正确 MPIN 的机会。 android 版本的 APP 可以正常运行,原因与 request.Any 类似?
看完你的问题后,我浏览了苹果参考文档。它说 webViewDidFinishLoad
在 webview 中加载每个帧后被调用。 Here is document
webViewDidFinishLoad: Sent after a web view finishes loading a frame.
请与服务器核实,一个 运行 有多少请求。它是 2 或 1。还想知道代码中的打印语句执行了多少次print("response = \(response)")
。因为我不同意这种说法。
在您的问题中发现您调用了 NSURLSession dataTaskWithRequest 并且还在 Web 视图中加载了请求。两次调用同一事物也可能会出现问题。如果你想在 webview 中打开请求,请不要使用 NSURLSession 任务请求。 运行 通过评论 task.resume()
.
您请求 NSMutableURLRequest
两次:
- 您将它传递给
URLSession
的 dataTaskWithRequest 方法。此方法 returns 数据来自您请求中的 URL 闭包。 - 您将其传递给
UIWebView
的 loadRequest 方法。此方法在您的UIWebView
(您的mob_webview
IBOutlet)中加载您请求的 URL 处的内容。
要解决此问题,您需要删除 URLSession
代码或 UIWebView
代码。你删除哪个取决于你想对服务器的响应做什么 - 你想要它作为数据还是你想在 webview 中加载它?如果你想把它作为数据,你应该使用 URLSession
并删除 UIWebView
loadRequest
。如果你想在 webview 中加载它,那么你应该使用 UIWebView
并删除任何 UISession
代码。
如果是您需要删除的 URLSession
代码,您应该删除以下所有代码:
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
data, response, error in
if error != nil {
print("error=\(error)")
return
}
print("response = \(response)")
let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("responseString = \(responseString)")
}
task.resume()
task.resume() 和 mob_webview.loadRequest(request) 将 运行 请求两次。
你最好在 loadRequest 之前删除 task.resume()。