2015-01-21 2 views
0

일부 자바를 실행하고 결과를 완료 블록을 통해 반환하는 방법을 알아 내려고했지만 어떤 이유로 콜백이 실행되지 않습니다.JavasScriptCore 비동기 콜백

+ (void)doSomethingWithCompletionHandler:(void (^)(NSError* error, NSString *result))completionHandler; 
{ 
    JSContext __block *context; 
    context = [[MyJSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]]; 
    context[@"done"] = (id) ^(NSString *result) 
    { 
     context = nil; 
     completionHandler(nil, result); 
    }; 

    // this works 
    // [context evaluateScript:@"(function(){ done('immediate'); })()"]; 

    // this does not 
    [context evaluateScript:@"(function(){ setTimeout(function(){ done('delayed'); }, 1000); })()"]; 

} 

은 최대한 빨리 타임 아웃을 사용하여 여기 시뮬레이션, 비동기를 만들기 위해 시도로, 문맥의 블록은 [ "완료"@] 호출되지 않습니다.

JSContext가 범위를 벗어날 때 할당 해제되지 않도록 JSContext를 확장했습니다 (따라서 __black 해킹).

내가 잘못 접근하고 있습니까?

답변

0

JavaScriptCore에는 setTimeout 함수가 없다는 것이 문제라고 생각합니다. 직접 쓰거나 (셀프 프로모션 같은) 존재하는 라이브러리를 찾아 볼 수 있습니다. https://github.com/artemyarulin/JSCoreBom

P. 많은 많은 많은 라이브러리를 사용하고 있기 때문에 최소한의 setTimeout을 가지고 정말 좋은 생각입니다

P.P.S 사용 JSContext setExceptionHandler 그

같은 오류를 포착하기 위해
0

JavaScriptCore에서는 setTimeout 및 setInterval과 같은 기능을 사용할 수 없으며 샌드 박스 처리 된 특성으로 인해 비동기 함수가 필요하지 않을 것으로 가정하므로 return 만 허용하고 완료해야합니다.)