我知道我不是第一个问这个问题的人,但我无法解决问题。我尝试使用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)")
问题是控制台只是打印:名称是()
答案 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)
})