解决了一个崩溃问题,可能有人会遇到,分享给大家。
昨天在ios上测试一个使用oc发送http请求数据,然后回调js层的功能。
使用的是 NSURLSessionDataTask 来发送异步的http请求,在http回调block里回调js层,来回测试了很多次, 偶发JS_ExecuteScript 崩溃。
对整个流程检查一直没找到问题,直到查看oc堆栈发现,回调是在另外一个线程里执行,而cocos是运行在ios的主线程,所以问题出来了,子线程里调用cocos-jsb的方法会导致jsb层异常,进而导致崩溃。(按理应该必崩,不知道为什么是偶发)
解决办法很简单,把jsb回调放到oc runtime的主线程执行
//主线程中更新cocos
dispatch_async(dispatch_get_main_queue(),^{
ScriptingCore::getInstance()->evalString( [str UTF8String]);
});
大概代码是这样
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
// ...
if (error) {
/* ... Handle error ... */
} else {
/* ... Send a response back to the device ... */
//主线程中更新cocos
dispatch_async(dispatch_get_main_queue(),^{
ScriptingCore::getInstance()->evalString( [str UTF8String]);
});
}
}];
[task resume];
这样之后就没什么问题了
最后,说明:会导致 JS_ExecuteScript 崩溃的原因很多,具体问题具体分析,最好是在evalString时做一个try catch包装保护。