Я пытаюсь найти способ выполнить некоторый Javascript и вернуть результат через блок завершения, но по какой-то причине обратный вызов никогда не срабатывает.
+ (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"] никогда не вызывается.
Я расширил JContext, чтобы убедиться, что он не освобождается, когда выходит за пределы области действия (отсюда и хак __black).
Я подхожу к этому неправильно?