簡體   English   中英

什么是 Xcode 中的主線程檢查器

[英]What is Main Thread Checker in Xcode

我檢查了 Xcode 9 文檔中的新內容,發現了這個

在此處輸入圖像描述

但我不明白我如何在新的 Xcode 9 中使用它。

它可以在方案的診斷選項中啟用/禁用。 此外,“問題暫停”是調試這些問題的舒適選項。

Xcode 11 在此處輸入圖像描述

Xcode <11 例子

來自Apple 文檔

Main Thread Checker 是一款用於 Swift 和 C 語言的獨立工具,可檢測 AppKit、UIKit 和后台線程上其他 API 的無效使用。 在主線程以外的線程上更新 UI 是一個常見的錯誤,可能會導致錯過 UI 更新、視覺缺陷、數據損壞和崩潰。

因此,例如嘗試在后台線程上更改UILabeltext屬性將不起作用。 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 視頻以獲得更詳細的解釋。

在 Runtime API Checking 部分下,確保啟用Main Thread Checker以查看您是否在非 UI 線程中執行 ui 方法

在此處輸入圖像描述

在此處輸入圖像描述

在 XCODE-12 中轉到調試然后選擇方案然后編輯方案選擇運行-> 診斷

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM