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的那些警告就沒有了。這樣重新編譯生成靜態庫。