dispatch_async UIWebView 加载请求
dispatch_async UIWebView loadrequest
我正在加载我的应用程序中的 javascript,脚本将尝试找到解决方案,这可能需要一些时间。我不想为该解决方案等待超过 5 秒,在那种情况下我只想停止请求并向用户显示一条消息。
我一直在尝试使用 NSTimers 和 dispatch_async 来做到这一点,但 UIWebView 请求仍在使用我的整个主队列,同时 NSTimer 已停止,我正在等待答案.
请求调用:
webViewUIView.delegate = self
var path = NSBundle.mainBundle().pathForResource("page", ofType: "html")
var url = NSURL(fileURLWithPath: path!)
var req = NSURLRequest(URL:url!)
var queue = NSOperationQueue()
dispatch_async(dispatch_get_main_queue()) {
println("********CALLING TO LOADREQUEST")
self.webViewUIView.loadRequest(req)
}
还有我的 NSTimer:
var timer2 = NSTimer()
func webViewDidStartLoad(webView: UIWebView) {
println("********Creating the Timer")
let aSelector : Selector = "cancelWeb"
self.timer2 = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: aSelector, userInfo: nil, repeats: false)
println("After create the timer")
}
取消网站:
func cancelWeb(){
println("****Before Stop Load")
webViewUIView.stopLoading()
println("After stopLoading")
timer2.invalidate()
}
我的 webViewDidFinishLoad:
func webViewDidFinishLoad(webView: UIWebView) {
webViewUIView.stringByEvaluatingJavaScriptFromString("func('\(obj)')")
let result: String = webViewUIView.stringByEvaluatingJavaScriptFromString("document.getElementById('log').innerText")!
timer2.invalidate()
...
...
当我 运行 应用程序时,进程仍然是 运行ning,即使在定时器中设置的 5 秒之后,我也只看到这个消息:关于创建 TImer,定时器之后,和调用加载请求。
关于如何 运行 请求与 NSTimer 同时并行的任何想法?如您所见,调度不起作用,可能是因为 URL 在同一个 Bundle 中?
好吧,与此同时,我正在等待解决方案,应用程序已冻结,只是在等待答案...这可能会花费很长时间。
在请求中使用超时是行不通的,因为连接是正确建立的,问题是需要很长时间才能收到答案。
谢谢各位!
您的代码中缺少另一个 UIWebView 委托函数。您可能想在
中添加 timer2.invalidate()
func webView(_ webView: UIWebView,
didFailLoadWithError error: NSError)
好的,我在我的 Javascript 代码中创建了一个 Worker,所以我可以像处理新线程一样处理它,但在 iOS 中不能(使用 UIWebView 无法做到)。解决方案在这里:
我正在加载我的应用程序中的 javascript,脚本将尝试找到解决方案,这可能需要一些时间。我不想为该解决方案等待超过 5 秒,在那种情况下我只想停止请求并向用户显示一条消息。
我一直在尝试使用 NSTimers 和 dispatch_async 来做到这一点,但 UIWebView 请求仍在使用我的整个主队列,同时 NSTimer 已停止,我正在等待答案.
请求调用:
webViewUIView.delegate = self
var path = NSBundle.mainBundle().pathForResource("page", ofType: "html")
var url = NSURL(fileURLWithPath: path!)
var req = NSURLRequest(URL:url!)
var queue = NSOperationQueue()
dispatch_async(dispatch_get_main_queue()) {
println("********CALLING TO LOADREQUEST")
self.webViewUIView.loadRequest(req)
}
还有我的 NSTimer:
var timer2 = NSTimer()
func webViewDidStartLoad(webView: UIWebView) {
println("********Creating the Timer")
let aSelector : Selector = "cancelWeb"
self.timer2 = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: aSelector, userInfo: nil, repeats: false)
println("After create the timer")
}
取消网站:
func cancelWeb(){
println("****Before Stop Load")
webViewUIView.stopLoading()
println("After stopLoading")
timer2.invalidate()
}
我的 webViewDidFinishLoad:
func webViewDidFinishLoad(webView: UIWebView) {
webViewUIView.stringByEvaluatingJavaScriptFromString("func('\(obj)')")
let result: String = webViewUIView.stringByEvaluatingJavaScriptFromString("document.getElementById('log').innerText")!
timer2.invalidate()
...
...
当我 运行 应用程序时,进程仍然是 运行ning,即使在定时器中设置的 5 秒之后,我也只看到这个消息:关于创建 TImer,定时器之后,和调用加载请求。
关于如何 运行 请求与 NSTimer 同时并行的任何想法?如您所见,调度不起作用,可能是因为 URL 在同一个 Bundle 中?
好吧,与此同时,我正在等待解决方案,应用程序已冻结,只是在等待答案...这可能会花费很长时间。
在请求中使用超时是行不通的,因为连接是正确建立的,问题是需要很长时间才能收到答案。
谢谢各位!
您的代码中缺少另一个 UIWebView 委托函数。您可能想在
中添加timer2.invalidate()
func webView(_ webView: UIWebView,
didFailLoadWithError error: NSError)
好的,我在我的 Javascript 代码中创建了一个 Worker,所以我可以像处理新线程一样处理它,但在 iOS 中不能(使用 UIWebView 无法做到)。解决方案在这里: