先放出Apple官方解釋地址:主線程檢查器
鏈接地址: https://developer.apple.com/documentation/code_diagnostics/main_thread_checker?language=objc
經(jīng)過(guò)一番苦心研究之后,大概意思說(shuō): 應(yīng)用中有些操作,如更新UI必須在主線程操作實(shí)現(xiàn),否則就會(huì)觸發(fā)此主線程檢查器。
如官網(wǎng)例子:
error:
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
****
self.label.text = [NSString stringWithFormat:@"%lu bytes downloaded", data.length];
****
// Error: label updated on background thread}];
[task resume];
right:
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
****
dispatch_async(dispatch_get_main_queue(), ^{ // Correct
self.label.text = [NSString stringWithFormat:@"%lu bytes downloaded", data.length];
});
****
}];
[task resume];
在實(shí)際開(kāi)發(fā)中,我還碰到過(guò)使用 MBProgressHUD
也會(huì)觸發(fā)此主線程檢查器,這個(gè)其實(shí)只是一種Xcode官方提供的檢查的方法,有的時(shí)候并不會(huì)導(dǎo)致多大問(wèn)題。而且只在 Run
時(shí)會(huì)出現(xiàn),在開(kāi)發(fā)上線并不會(huì)出現(xiàn)。或者只在 Debug
模式下出現(xiàn),不會(huì)在 Release
中出現(xiàn)。
但是有的時(shí)候會(huì)短暫卡死應(yīng)用,這時(shí)候看日志打印舊有相應(yīng)的錯(cuò)誤,當(dāng)然了 主線程
檢測(cè)也可以關(guān)閉。
關(guān)閉方法:
Edit Scheme -> Run -> Diagnostics -> Runtime API Checking : Main Thread Checker取消勾選即可
但根據(jù)最新的Apple-Xcode,iOS 13.0中出現(xiàn),未在主線程實(shí)現(xiàn)某些操作或方法,會(huì)導(dǎo)致應(yīng)用某些崩潰的出現(xiàn)。所以,在Run
代碼后如果觸發(fā)主線程檢查器,及時(shí)查找更改,以避免發(fā)生的未知錯(cuò)誤。