![](/img/trans.png)
[英]ARKit template Xcode project Main Thread Checker log console
[英]What is Main Thread Checker in Xcode
來自Apple 文檔:
Main Thread Checker 是一款用於 Swift 和 C 語言的獨立工具,可檢測 AppKit、UIKit 和后台線程上其他 API 的無效使用。 在主線程以外的線程上更新 UI 是一個常見的錯誤,可能會導致錯過 UI 更新、視覺缺陷、數據損壞和崩潰。
因此,例如嘗試在后台線程上更改UILabel
的text
屬性將不起作用。 Apple 表示,這可能會導致錯過 UI 更新、視覺缺陷、數據損壞和崩潰。 實際上,99% 的時間這將導致隨機錯過 UI 更新和視覺缺陷(而不是崩潰)。
崩潰實際上是件好事,因為我們可以很容易地檢測到UIKit
的這種不當使用,但隨機視覺缺陷在開發過程中很難檢測到。 這就是主線程檢查器的用武之地。
主線程檢查器將幫助檢測UIKit
在后台線程上的使用,它不會解決它們。 一旦檢測到在后台線程上使用了UIKit
,就可以使用DispatchQueue
解決它。
同樣,來自Apple 文檔:
URLSession
的文檔說完成閉包將在后台線程上調用,所以這很糟糕,Main Thread Checker 將幫助您檢測后台線程上 UIKit 的使用。
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
self.label.text = "\(data.count) bytes downloaded"
// Error: label updated on background thread
}
}
task.resume()
解決方案:使用DispatchQueue.main
在主線程上執行 UI 更新。
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let data = data {
DispatchQueue.main.async { // Correct
self.label.text = "\(data.count) bytes downloaded"
}
}
}
task.resume()
解決方案本身與 Xcode 無關,它是該語言的一個特性。 所以很明顯,在以前的 Xcode 版本中這是可能的,但是在 Xcode 9 之前,您沒有 Main Thread Checker 來幫助您檢測問題。
正如@hamish 指出的那樣,您還可以觀看WWDC 視頻以獲得更詳細的解釋。
在 XCODE-12 中轉到調試然后選擇方案然后編輯方案選擇運行-> 診斷
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.