gpt4 book ai didi

javascript - 如何使用 JavaScriptCore 在 Swift 中从 JavaScript SDK 调用异步 JavaScript 函数

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:31 24 4
gpt4 key购买 nike

我正在尝试使用 JSCore 在 Swift 中从 javascript SDK 执行异步函数。我已经能够完成评估和查看脚本的内容,但在实际调用异步函数时却没有成功。这是我的代码,用于验证我是否已经阅读了脚本。关于如何实现这一点有什么想法吗?

lazy var context: JSContext? = {
let context = JSContext()

guard let
commonJSPath = Bundle.main.path(forResource: "test", ofType: "js") else {
print("Unable to read resource files.")
return nil
}

do {
let common = try String(contentsOfFile: commonJSPath, encoding: String.Encoding.utf8)
_ = context?.evaluateScript(common)
} catch (let error) {
print("Error while processing script file: \(error)")
}

return context
}()

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
setupJS()

}

func setupJS(){
guard let context = context else {
print("JSContext not found.")
return
}

let dictionary = context.objectForKeyedSubscript("MainObject").toDictionary()
print(dictonary)
//let script = "const {variableName} = FooJS;";
//let result = context.evaluateScript(script)

}

我想做一些类似async function doSomething(){ return 'hello world!'; }
console.log(await doSomething());

最佳答案

从 swift 调用 javascript 函数:

context.objectForKeyedSubscript("functionName_in_Javascript_file").call(withArguments: [])

为了让控制权回到 swift,你可以像这样定义一个从 javascript 调用的 block :

//someString 可能是您需要的来自 javascript 的结果。

let swiftHandler: @convention(block) (String) -> Void = {(someString) in
//do something
}

//像这样使 block 对 javasript 可用:

let swiftBlock = unsafeBitCast(swiftHandler, to: AnyObject.self)

context.setObject(swiftBlock, forKeyedSubscript: "swiftCallback" as (NSCopying & NSObjectProtocol)!)

//最后在你的 javascript 文件中,当你获得你需要的结果时,只需使用你在上一步中给它的名称调用 swift 函数:

swiftCallback(result);

关于javascript - 如何使用 JavaScriptCore 在 Swift 中从 JavaScript SDK 调用异步 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47024253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com