【问题标题】:How to stop JavaScriptCore JSContext evaluating by force on iOS?如何在 iOS 上强制停止 JavaScriptCore JSContext 评估?
【发布时间】:2020-08-26 20:44:03
【问题描述】:

有时应该强制停止正在评估的脚本,但我找不到实现此目的的方法。有人指出JSContextGroupSetExecutionTimeLimit 可能有效,但它不在我的测试中,有人可以帮忙吗?

另一个参考:https://github.com/phoboslab/JavaScriptCore-iOS/issues/14

我的代码:

int extendTerminateCallbackCalled = 0;
static bool extendTerminateCallback(JSContextRef ctx, void *context)
{
    extendTerminateCallbackCalled++;
    if (extendTerminateCallbackCalled == 2) {
        JSContextGroupRef contextGroup = JSContextGetGroup(ctx);
        JSContextGroupSetExecutionTimeLimit(contextGroup, .200f, extendTerminateCallback, 0);
        return false;
    }
    return true;
}

+ (void)stop
{
    JSGlobalContextRef ref = [_context JSGlobalContextRef];
    JSContextGroupRef contextGroup = JSContextGetGroup(ref);
    JSContextGroupSetExecutionTimeLimit(contextGroup, .200f, extendTerminateCallback, 0);
}

【问题讨论】:

    标签: ios objective-c webkit javascriptcore jscontext


    【解决方案1】:

    这是一个可能的方法的想法

    + (void)stop
    {
         JSContext *context = [JSContext currentContext]; // or whichever your
    
         // set property of JS global object to specific know value
         // that should be checked inside JS code regularly during
         // long operations and interrupt self execution
         context[@"externallyCancelled"] = @(YES); 
    }
    

    【讨论】:

    • 这可能是正确的答案,应该被接受。最靠谱的方式大概就是设置一个flag,然后加代码提前退出JS,如示例所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 2010-12-08
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多