Возвращает строку HTML из обработчика завершения функции AssessmentJavaScript.

Я знаю, что я не первый, кто задает этот вопрос, но я не могу решить проблему. Я пытаюсь взять фрагмент строки из HTML, используя evaluateJavaScript в Xcode с Swift 3, и фрагмент текста называется value внутри обработчика завершения, поэтому я сделал так:

var userName = String()

   func takeData() {
        webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (value, error) in

            if let valueName = value as? String {
                self.userName = valueName
            }
            print(value)
            print(error)
        }

    }

print(" The name is : \(self.userName)") 

Проблема в том, что консоль просто печатает: Имя ()


person Albifer    schedule 15.08.2017    source источник
comment
это вызывается после завершения загрузки веб-просмотра?   -  person koropok    schedule 15.08.2017


Ответы (1)


Проблема в том, что вы печатаете значение до того, как ваша асинхронная функция сможет завершить выполнение. У вас есть несколько решений для решения этой проблемы. Вы можете либо реализовать takeData, чтобы иметь завершениеHandler в качестве одного из своих входных параметров, использовать GCD, чтобы ваши операторы выполнялись в ожидаемом порядке, либо использовать стороннюю библиотеку, например PromiseKit для обработки асинхронных запросов, поэтому они будут вести себя как обычные функции с возвращаемым значением.

Я приведу вам пример с обработчиком завершения:

func takeData(completionHandler: @escaping (_ userName: String?) -> Void){
    webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (value, error) in
        if let valueName = value as? String {
            completionHandler(valueName)
        }
        print(value)
        print(error)
        completionHandler(nil)
    }
}

Вы используете значение из завершенияHandler следующим образом:

takeData(completionHandler: { userName in
    print(userName)
})
person Dávid Pásztor    schedule 15.08.2017