2015-02-08 53 views
0

我正在加載一個位於我的應用程序中的JavaScript,腳本將嘗試查找解決方案,這可能需要一些時間。我不想等待超過5秒的解決方案,在這種情況下,我只想停止請求並向用戶顯示一條消息。dispatch_async UIWebView loadrequest

我一直在嘗試使用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") 

} 

的cancelWeb:

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秒後,進程仍在運行,我只看到這個meesage:關於創建TImer,定時器之後和調用LOADREQUEST。

有關如何與NSTimer同時並行運行請求的任何想法?正如你所看到的那樣,派遣不起作用,也許是因爲這個URL在同一個Bundle中?

那麼,在此期間,我正在等待解決方案,應用程序被凍結,只是等待答案...這可能需要很長時間。

在請求中使用超時無法正常工作,因爲連接建立正確,問題是需要很長時間才能收到答案。

謝謝你!

+0

爲什麼你首先發送一個帶有[[NSURLConnection sendAsynchronousRequest]]的請求?如果你想在html頁面中執行一個javascript方法,你可以使用'[UIWebView stringByEvaluatingJavaScriptFromString:]' – ozgur 2015-02-08 01:45:46

+0

這只是我正在嘗試的一種行爲,但是沒有sendAsynch也是同樣的效果......我知道關於stringByEval。 ..但情況是相同的,如果超過X秒,我該如何停止腳本?是我面臨的問題(我會更新有關sendAsynch的代碼以防萬一) – 2015-02-08 01:48:11

回答

0

玉傢伙添加timer2.invalidate(),我在Javascript代碼創建一個工人,所以我能處理如新的線程,但不是在iOS的(這是不可能使用一個UIWebView做)。解決辦法是這樣的:iOS Javascript Workers High CPU after terminate()

0

代碼中缺少另一個UIWebView委託函數。你可能想在

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

我認爲你把錯誤的代碼放在你的答案中?你只是寫了和我一樣的代碼(你說:而不是使用scheduledTimerWithTimeInterval,試試)......但你的顯示我一樣。關於didFailLoadWithError ...這是不正確的,因爲正確「加載」,事情需要很長時間,但請求中沒有錯誤。謝謝 – 2015-02-08 02:20:40

+0

當你說它需要很長時間時,這是否意味着請求在5秒後不會超時?我想說的是,如果你添加日誌在func webView(_ webView:UIWebView, didFailLoadWithError錯誤:NSError)會說什麼調試? – JocelynH 2015-02-08 02:24:46

+0

什麼都沒有,javscript只是處理輸入(可能需要幾分鐘),並將結果作爲結果發送,是唯一的輸出 – 2015-02-08 03:08:04

相關問題