Cocoa .scrollToEndOfDocument перестает работать после первой попытки

Я пишу небольшую программу для MacOS с WebView, которая загружает веб-сайт. Это один из тех сайтов, которые автоматически загружают больше контента при прокрутке вниз. Как истечение срока, я пытаюсь написать код, который будет постоянно прокручивать страницу вниз, чтобы больше ее загружалось и так далее.

Что у меня есть до сих пор это:

scrollToBottomTotalTimes = 10
self.myWebView.mainFrame.load(NSURLRequest(url: NSURL(string: urlString)! as URL) as URLRequest!)

func webView(_ sender: WebView!, didFinishLoadFor frame: WebFrame!) {

        var scrollToBottomCurrentTimes = 0
        while scrollToBottomCurrentTimes != scrollToBottomTotalTimes {
            scrollToBottomCurrentTimes += 1
            self.myWebView.scrollToEndOfDocument(self)
            sleep(2) //give the page some time to load
        }
}

Это работает хорошо один раз: страница загружается, она прокручивается вниз, и загружается большая часть страницы.

Однако после этого WebView больше не прокручивается, несмотря на достаточное время для перезагрузки страницы. Положение на странице остается точно таким же, как и раньше.

У меня такое ощущение, что .scrollToEndOfDocument(self) не замечает, что веб-страница стала длиннее.

Есть ли способ «обновить» .scrollToEndOfDocument(self), чтобы он знал, где находится новая нижняя часть страницы?

Спасибо!


person Giulio Crisanti    schedule 11.10.2016    source источник


Ответы (1)


Мне кажется, что вы используете неправильный подход. Предполагая, что поступает новый контент, вы можете получить несколько запросов к didFinishLoadFor. Однако вы выполняете цикл внутри метода со сном внутри метода, который блокирует основную очередь и отключает механизм событий.

Я предлагаю вам настроить событие таймера, используя Grand Central Dispatch (GCD), а затем запустить событие прокрутки из события таймера. Обратите внимание, что вы должны выполнять прокрутку в основной очереди, а событие таймера не находится в основной очереди. Просто ознакомьтесь с документацией по GCD. См. https://developer.apple.com/reference/dispatch.

person Fred Appelman    schedule 28.01.2017