从evaluateJavaScript函数的完成处理程序返回HTML字符串

时间:2017-08-15 09:12:19

标签: javascript html swift webkit completionhandler

我知道我不是第一个问这个问题的人,但我无法解决问题。我尝试使用Xcode中的evaluateJavaScript和Swift 3从HTML中获取一段字符串,并且在完成处理程序中将该文本称为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)") 

问题是控制台只是打印:名称是()

1 个答案:

答案 0 :(得分:1)

问题是您在异步函数完成执行之前打印了该值。您有几种解决方案可以解决此问题。您可以实现takeData将completionHandler作为其输入参数之一,使用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)
    }
}

您可以使用completionHandler中的值,如下所示:

takeData(completionHandler: { userName in
    print(userName)
})