dispatch_async запрос загрузки 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()
...
...

Когда я запускаю приложение, процесс все еще выполняется, даже после 5 секунд, установленных в таймере, я вижу только это сообщение: о создании TImer, After Timer и CALLING TO LOADREQUEST.

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

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

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

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


person Cris R    schedule 08.02.2015    source источник
comment
Почему вы отправили запрос с [NSURLConnection sendAsynchronousRequest] в первую очередь? Если вы хотите выполнить метод javascript на странице html, вы можете использовать [UIWebView stringByEvaluatingJavaScriptFromString:]   -  person ozgur    schedule 08.02.2015
comment
Это всего лишь один из способов, которые я пробовал, но тот же эффект без sendAsynch... Я знаю о stringByEval... но дело в том же, как я могу остановить скрипт, если он занимает больше X секунд? Это проблема, с которой я столкнулся (на всякий случай я обновлю код о sendAsynch)   -  person Cris R    schedule 08.02.2015


Ответы (2)


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

func webView(_ webView: UIWebView,
 didFailLoadWithError error: NSError)
person JocelynH    schedule 08.02.2015
comment
Я думаю, вы указали неправильный код в своем ответе? Вы просто пишете тот же код, что и я (вы сказали: вместо использования scheduleTimerWithTimeInterval попробуйте)... но вы показываете мне то же самое. Насчет didFailLoadWithError... это не правильно, потому что загружается правильно, дело идет долго, а ошибок в запросе нет. Спасибо - person Cris R; 08.02.2015
comment
когда вы говорите, что это занимает слишком много времени, означает ли это, что время ожидания запроса не истекает через 5 секунд? Я пытаюсь сказать, что если вы добавите журнал в func webView (_ webView: UIWebView, didFailLoadWithError error: NSError), скажет ли это что-нибудь для отладки? - person JocelynH; 08.02.2015
comment
вообще ничего, javascript просто обрабатывает ввод (что может занять минуты) и отправляет ответ как результат, это единственный вывод - person Cris R; 08.02.2015

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

person Cris R    schedule 09.02.2015