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 无法做到)。解决方案在这里: