今天寫了一個實時更新相關數據的App,但是build出來發現,show 下面的warning:
[reports] Main Thread Checker: UI API called on a background thread: -[NSCell stringValue]
很奇怪,不太懂這個邏輯,什么是 UI API 呼叫背景thread?
查詢一番得知,引用大大的解釋:
一般做服務端的人基本沒有MainThread和 BackgroundThread的概念,但是這個概念在客戶端中是非常重要的,因為客戶端不管安卓還是iOS,UI刷新需要始終占用主線程去刷新,如果一旦占用bg線程,雖然不會發生致命錯誤,但是也會提示這種warning級別的報錯; 同樣,如果我們把一些本應該在bg中執行的網絡請求放在了Main中,那么會導致UI停止刷新,雙方執行了sync操作,體驗非常差,這是不規范的操作。
所以,問題的原因出在UI的處理沒有強制到main thread去執行。
解決方式
方法一:
其實這個Main Thread Checker是xcode9 新增runtime check的功能,如果你的app 只是單純的show warning沒有crash的話,你可以拿到這個check,以免看着心煩😂
方法二:
我們是不可能按照方法一去掩耳盜鈴的,對吧,既然問題出現在UI操作沒有到主線程中,那么我們將其強制定義到主線程操作即可
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
//Your UI Handle Code
});
});
更改好處理后果然不會再show 這個warning了,瞬間感覺舒服好多😁
有遇見同樣問題的小伙伴,你也試試看吧。