ios - stringByEvaluatingJavaScript(来自 :) return value equivalent

标签 ios swift asynchronous wkwebview

我知道似乎有人问过这个问题,但我对此方法有不同的问题。

UIWebView 的 - stringByEvaluatingJavaScript(from:) 同步返回 String? 值。

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

我正在处理遗留代码,并且 stringByEvaluatingJavaScript(from:) 影响代码中的数千行,并且可以在任何地方和许多返回值的函数中找到(不使用 block ) )。

非常简单的例子 -

@discardableResult func js(_ script: String) -> String? {
        let callback = self.stringByEvaluatingJavaScript(from: script)
        if callback!.isEmpty { return nil }
        return callback
    }

现在我要更改为 evaluateJavaScript(_:completionHandler:) 我将需要使用 block 和方法来处理 js(script:) 方法使用该方法需要更改等等...

我认为,为了在不更改所有代码的情况下解决此问题,我需要 evaluateJavaScript(_:completionHandler:) 同步返回 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
        }

我不确定结果中可以返回哪些类型,因此请注意这一点。除此之外,效果很好。

关于ios - stringByEvaluatingJavaScript(来自 :) return value equivalent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59444004/

相关文章:

ios - 为什么我在 iOS 9 上收到重复的推送通知?

ios - UILocalNotification 没有在正确的时间触发

ios - 导入 AssetsLibrary 后 Xcode 生成项目错误

ios - 如果外围设备出现问题则循环

java - 如何在 Java 中使用 Vert.X 运行 CPU 密集型并行任务

entity-framework - EF Core 中使用注入(inject) DbContext 的并行异步调用的最佳实践是什么?

javascript - 如何阻止多个异步 Parse 云调用直到完成?

ios - 快速覆盖UIView的init方法

ios - 如何在 iPhone 的手势识别器中获取原始附加 View ?

ios - 在扩展中添加和删除 Notification Observer