将异步块回调转换为同步返回值

问题描述 投票:0回答:1

UIWebView's-stringByEvaluatingJavaScript(from:)正在同步返回String?值。

WKWebView等效项evaluateJavaScript(_:completionHandler:)与complitionHandler一起使用。

我正在使用遗留代码,并且stringByEvaluatingJavaScript(from:)影响了代码中的数千行,可以在随处可见的许多返回值的函数中找到(不使用块)。

非常简单的示例-

@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:)来同步返回String?

有人知道如何实现吗?或有其他解决方案?

ios swift asynchronous
1个回答
0
投票

找到它-

将其添加到您的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中可以返回什么类型,所以请当心。否则效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.