从evaluateJavaScript函数的完成处理程序返回HTML字符串
我知道我不是第一个问这个问题的人,但我解决不了这个问题。我试图在Xcode with Swift 3中使用从evaluateJavaScript函数的完成处理程序返回HTML字符串,javascript,html,swift,webkit,completionhandler,Javascript,Html,Swift,Webkit,Completionhandler,我知道我不是第一个问这个问题的人,但我解决不了这个问题。我试图在Xcode with Swift 3中使用evaluateJavaScript从HTML中提取一段字符串,该段文本在完成处理程序中被称为value,因此我这样做: var userName = String() func takeData() { webView.evaluateJavaScript("document.querySelectorAll('.name')[0].innerHTML") { (v
evaluateJavaScript
从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)")
takeData(completionHandler: { userName in
print(userName)
})
问题是控制台只是打印:名称是()问题是在异步函数完成执行之前打印值。您有几种解决此问题的方法。您可以实现
takeData
将completionHandler作为其输入参数之一,使用GCD
使语句按预期顺序执行,或者使用第三方库,例如为您处理异步请求,以便它们的行为类似于具有返回值的正常函数
我将为您提供一个关于完成处理程序的示例:
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中的值,如下所示:
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)")
takeData(completionHandler: { userName in
print(userName)
})
是否在webview完成加载后调用?