2013-10-21 1 views
2

JavaScriptCore를 사용하여 내 앱에서 간단한 스크립트를 평가하고 있습니다. 나는 전역 객체를 생성 등처럼 일부 속성을 정의하고 있습니다 : Obj-C에서 콜백을 사용하여 Javascript 함수를 정의하는 방법은 무엇입니까?

JSContext *context = [[JSContext alloc] init]; 
JSValue *globalObject = [context globalObject]; 

[globalObject setValue:fields forProperty:@"fields"]; 
... 

그래서 다음 스크립트 등 fields의 값에 액세스 할 수 있습니다. 스크립트에서 lookup이라는 함수를 사용할 수있게하고 싶습니다. 이미이 함수에 대한 Objective-C 구현이 있습니다.

Objective-C 메서드를 다시 호출하는 함수 인 전역 개체에 속성을 추가하려면 어떻게해야합니까? 나는 JSObjectMakeFunctionWithCallback이라는 함수가 있다는 것을 알았지 만, JSObjectRef과 같은 저수준 C 구조를 사용하고 Objective-C 블록이 아닌 C 함수를 사용하므로 구현 내에서 self을 사용할 수 없습니다.

답변

1

Objective-C 블록을 JSContext에 전달하면 JSContext가 함수로 작동합니다.

context[@"factorial"] = ^(int x) { 
    int factorial = 1; 
    for (; x > 1; x--) { 
     factorial *= x; 
    } 
    return factorial; 
}; 
[context evaluateScript:@"var fiveFactorial = factorial(5);"]; 
JSValue *fiveFactorial = context[@"fiveFactorial"]; 
NSLog(@"5! = %@", fiveFactorial); 

출처 : Bignerdranch

그런 식으로, 스크립트는 아이폰 OS 코드로 다시 호출 할 수 있습니다