dispatch_async UIWebView的loadrequest

我正在加载一个在我的应用程序的JavaScript,脚本将尝试find一个解决scheme,这可能需要一些时间。 我不想等待超过5秒的解决scheme,在这种情况下,我只是想停止请求,并显示一条消息给用户。

我一直试图用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() ... ... 

当我运行这个应用程序的时候,这个过程仍然在运行,即使在定时器设置了5秒之后,我也只能看到这个问题:关于创buildTImer,定时器之后和调用LOADREQUEST。

有关如何与NSTimer同时并行运行请求的任何想法? 正如你看到派遣不工作,也许是因为该URL在同一个捆绑包?

那么,在此期间,我正在等待解决scheme,应用程序被冻结,只是在等待答案…这可能需要很长的时间。

在请求中使用超时不起作用,因为连接build立正确,问题是需要很长时间才能收到答案。

谢谢你!

代码中缺less另一个UIWebView委托函数。 你可能想添加timer2.invalidate()

 func webView(_ webView: UIWebView, didFailLoadWithError error: NSError) 

好吧,我在我的Javascript代码中创build了一个Worker,所以我可以像处理新线程那样处理它,但是不能在iOS中处理(使用UIWebView是不可能的)。 解决方法是这样的: iOS Javascript工作高CPU之后终止()