2015-02-08 5 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 секунд, установленных в таймере, я вижу только это сообщение: о создании TImer, After Timer и CALLING TO LOADREQUEST.

Любые идеи о том, как параллельно выполнять запрос параллельно с NSTimer? Как вы видите, отправка не работает, может быть, потому, что URL-адрес находится в одном комплекте?

Ну, пока я жду решения, приложение заморожено, просто ждет ответа ... который может занять время.

Использование таймаута в запросе не работает, потому что соединение установлено правильно, дело в том, что требуется много времени, чтобы получить ответ.

Спасибо, ребята!

+0

Почему вы отправили запрос с '[NSURLConnection sendAsynchronousRequest]' в первую очередь? Если вы хотите выполнить javascript-метод на странице html, вы можете использовать '[UIWebView stringByEvaluatingJavaScriptFromString:]' – ozgur

+0

Это всего лишь один из тех, кого я пытался, но это тот же эффект, что и в sendAsynch ... Я знаю о stringByEval. .. но случай тот же, как я могу остановить скрипт, если занимает больше X секунд? Является ли проблема, с которой я столкнулся (я обязательно обновлю код о sendAsynch на всякий случай) –

ответ

0

Ok ребята, я создал работник в своем коде Javascript, поэтому я могу справиться с этим, как новые темы, но не в прошивкой (что было невозможно сделать с помощью UIWebView). Решение находится здесь: iOS Javascript Workers High CPU after terminate()

0

В вашем коде отсутствует еще одна функция делегата UIWebView. Вы можете добавить timer2.invalidate() в

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

Я думаю, что вы ввели неправильный код в свой ответ? Вы просто пишете тот же код, что и я (вы сказали: вместо использования schedTimerWithTimeInterval, попробуйте) ... но вы показываете мне то же самое. О didFailLoadWithError ... это неправильно, потому что это «загрузка» правильно, вещь занимает много времени, но ошибок в запросе нет. Спасибо –

+0

, когда вы говорите, что это слишком долго, означает ли это, что запрос не истечет через 5 секунд? Я пытаюсь сказать, что если вы добавите журнал в func webView (_ webView: UIWebView, didFailLoadWithError error: NSError) скажет что-нибудь для отладки? – JocelynH

+0

ничего, javscript просто обрабатывает вход (который может занять несколько минут) и отправляет ответ в качестве результата, является единственным выходом –