JavasScriptCore异步回调
问题描述:
我试图找出一种方法来执行一些JavaScript,并通过完成块返回结果,但由于某种原因,回调从不触发。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); })()"];
}
只要我尝试使用异步,在此使用超时进行模拟,上下文[@“done”]中的块永远不会被调用。
我已经扩展了JSContext以确保它在超出作用域时不会被释放(因此__black破解)。
我接近这个错误的方式吗?
答
我想问题是JavaScriptCore中没有setTimeout函数。你可以自己写,也可以寻找一些类似的库(自我推销!)https://github.com/artemyarulin/JSCoreBom
P.S. 它至少有setTimeout的非常好的主意,因为多对多的,许多图书馆正在使用
P.P.S 使用JSContext setExceptionHandler为了赶上这样的
错误
答
似乎像setTimeout和setInterval这样的函数在JavaScriptCore中不可用,并且由于它的沙盒特性,我假设我不需要任何异步函数,因此只需要return
并且完成它; )