【问题标题】:How to call an async javascript function from a javascript SDK in Swift with JavaScriptCore如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数
【发布时间】: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 中等待结果

标签: javascript ios swift javascriptcore


【解决方案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);

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2022-12-04
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2019-01-07
    • 2012-02-25
    • 2019-02-20
    • 1970-01-01
    相关资源
    最近更新 更多