如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数
Posted
技术标签:
【中文标题】如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数【英文标题】:How to call an async javascript function from a javascript SDK in Swift with JavaScriptCore 【发布时间】:2017-10-30 21:14:07 【问题描述】:我正在尝试使用 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 运行时等待一些同步“完成”还是什么? 我有 2 个问题,一个是下标要调用的实际函数,然后在 Swift 中等待结果 【参考方案1】:从 swift 调用 javascript 函数:
context.objectForKeyedSubscript("functionName_in_Javascript_file").call(withArguments: [])
为了让控制权返回给 swift,您可以定义一个从 javascript 调用的块,如下所示:
//someString 可能是您需要来自 javascript 的结果。
let swiftHandler: @convention(block) (String) -> Void = (someString) in
//do something
//像这样使块对 javasript 可用:
let swiftBlock = unsafeBitCast(swiftHandler, to: AnyObject.self)
context.setObject(swiftBlock, forKeyedSubscript: "swiftCallback" as (NSCopying & NSObjectProtocol)!)
//最后在您的javascript文件中,当您获得所需的结果时,只需使用您在上一步中提供的名称调用swift函数:
swiftCallback(result);
【讨论】:
以上是关于如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Browserify & iOS JavaScriptCore
如何使用 JavaScriptCore 将错误记录到 XCode?
一个人如何在JavaScriptCore中使用摩卡咖啡和柴? [关闭]
如何在 Swift 的 JavaScriptCore 中导入模块?