2017-10-30 7 views
3

JSCore를 사용하여 Swift의 javascript SDK에서 비동기 함수를 실행하려고합니다. 스크립트의 내용을 평가하고 볼 수 있지만 실제로 비동기 함수를 호출하는 데 실패했습니다. 다음은 스크립트를 읽었 음을 확인하는 코드입니다. 이 작업을 수행하는 방법에 대한 의견이 있으십니까?JavaScriptCore를 사용하여 Swift의 javascript SDK에서 비동기 javascript 함수를 호출하는 방법

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());

+0

어떻게 성공하지 못했습니까? Swift 런타임이 동기화 된 "finish"또는 어떤 것을 기다리는 것이 문제입니까? – Pointy

+0

2 가지 문제가 있습니다. 하나는 실제 함수 호출에 subscripting 한 다음 Swift에서 결과를 기다리는 것입니다. – iPhonig

답변

1

그런 짓을하고 싶습니다 :

다시 빠른 제어를 얻기 위하여
context.objectForKeyedSubscript("functionName_in_Javascript_file").call(withArguments: []) 

, 당신이 블록을 정의 할 수 있습니다 자바 스크립트에서 다음과 같이 호출 될 수 있습니다 :

// someString은 javascript에서 필요한 결과 일 수 있습니다.

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

이 같은 기능인 자바 스크립트를 사용할 수 블록을 // :

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

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

은 당신이 당신이 필요로하는 결과를 얻을 때 마지막으로 당신의 자바 스크립트 파일에서, 단지 신속 기능을 사용하여 이름을 부르는 당신은 그것을 준 // 이전 단계 :

swiftCallback(result);