iOS 解决Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]
Xcode 9以后增加了新特性“主线程检测器(Main Thread Checker)”,这样在运行IJK时,就会报IJKSDLGLView里面,子线程获取“UIApplication的applicationState”、layer。
有些人的做法是关闭检测器,但这并没有从根本上解决问题,就应该将这些操作改成使用主线程进行操作,下面是我的做法,直接修改IJKSDLGLView的源码。
首先,增加个只在主线程操作的方法,这个方法里面就是先判断当前是否在主线程,如果是就直接执行,否则同步切换到主队列进行执行。
static void IJKHanleInMainThread(dispatch_block_t mainThreadblock) {
if ([NSThread currentThread] == [NSThread mainThread]){
mainThreadblock();
} else {
dispatch_sync(dispatch_get_main_queue(), ^{
mainThreadblock();
});
}
}
其次将方法- (BOOL)isApplicationActive里面改成这样:
__block UIApplicationState appState = 0;
IJKHanleInMainThread(^{
appState = [UIApplication sharedApplication].applicationState;
});
将方法- (void)displayInternal: (SDL_VoutOverlay *) overlay里面改成这样
IJKHanleInMainThread(^{
[[self eaglLayer] setContentsScale:_scaleFactor];
});
IJKHanleInMainThread(^{
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
});
最后执行IJK的demo,发现子线程操作UI的那些警告就没有了。这样重新编译生成静态库。