stringByEvaluatingJavaScript(from:) return 等效值
stringByEvaluatingJavaScript(from:) return value equivalent
我知道有人问过这个问题,但我对这个方法有不同的问题。
UIWebView's
- stringByEvaluatingJavaScript(from:)
同步 returning 一个 String?
值。
WKWebView
等价物 evaluateJavaScript(_:completionHandler:)
与 complitionHandler 一起工作。
我正在使用遗留代码,我 stringByEvaluatingJavaScript(from:)
影响了代码中的数千行,并且可以在任何地方和许多函数中找到 return 值(不使用块) .
非常简单的例子 -
@discardableResult func js(_ script: String) -> String? {
let callback = self.stringByEvaluatingJavaScript(from: script)
if callback!.isEmpty { return nil }
return callback
}
现在我要更改为 evaluateJavaScript(_:completionHandler:)
我将需要使用块处理 js(script:)
方法,并且使用该方法的方法需要更改等等...
我认为为了在不更改所有代码的情况下解决此问题,我需要 evaluateJavaScript(_:completionHandler:)
同步 return String?
.
有人知道如何实现吗?或者可能有不同的解决方案?
找到了 -
将此添加到您的 WKWebview
扩展中以将 evaluateJavaScript(_:completionHandler:)
包装在同步扭曲中,如 UIWebview
-
open func stringByEvaluatingJavaScript(from script: String) -> String?
{
var finished = false
var stringResult: String? = nil
evaluateJavaScript(script) { (result, error) in
if error == nil, let result = result
{
stringResult = String(describing: result)
}
finished = true
}
while !finished
{
RunLoop.current.run(mode: .default, before: Date.distantFuture)
}
return stringResult
}
我不确定 result
中可以返回哪些类型,因此请注意这一点。否则效果很好。
我知道有人问过这个问题,但我对这个方法有不同的问题。
UIWebView's
- stringByEvaluatingJavaScript(from:)
同步 returning 一个 String?
值。
WKWebView
等价物 evaluateJavaScript(_:completionHandler:)
与 complitionHandler 一起工作。
我正在使用遗留代码,我 stringByEvaluatingJavaScript(from:)
影响了代码中的数千行,并且可以在任何地方和许多函数中找到 return 值(不使用块) .
非常简单的例子 -
@discardableResult func js(_ script: String) -> String? {
let callback = self.stringByEvaluatingJavaScript(from: script)
if callback!.isEmpty { return nil }
return callback
}
现在我要更改为 evaluateJavaScript(_:completionHandler:)
我将需要使用块处理 js(script:)
方法,并且使用该方法的方法需要更改等等...
我认为为了在不更改所有代码的情况下解决此问题,我需要 evaluateJavaScript(_:completionHandler:)
同步 return String?
.
有人知道如何实现吗?或者可能有不同的解决方案?
找到了 -
将此添加到您的 WKWebview
扩展中以将 evaluateJavaScript(_:completionHandler:)
包装在同步扭曲中,如 UIWebview
-
open func stringByEvaluatingJavaScript(from script: String) -> String?
{
var finished = false
var stringResult: String? = nil
evaluateJavaScript(script) { (result, error) in
if error == nil, let result = result
{
stringResult = String(describing: result)
}
finished = true
}
while !finished
{
RunLoop.current.run(mode: .default, before: Date.distantFuture)
}
return stringResult
}
我不确定 result
中可以返回哪些类型,因此请注意这一点。否则效果很好。